| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- package main
- import (
- "encoding/json"
- "github.com/gorilla/mux"
- "log"
- "math/rand"
- "net/http"
- "strconv"
- "strings"
- )
- type Book struct {
- ID string `json:"id"`
- Isbn string `json:"isbn"`
- Title string `json:"title"`
- Author *Author `json:"author"`
- }
- type Author struct {
- Firstname string `json:"firstname"`
- Lastname string `json:"lastname"`
- }
- // 初始化book的切片
- var books []Book
- func main() {
- // 初始化路由
- r := mux.NewRouter()
- // 增加mock数据
- books = append(books, Book{ID: "1", Isbn: "448743", Title: "Go语言", Author: &Author{Firstname: "John", Lastname: "Doe"}})
- books = append(books, Book{ID: "2", Isbn: "448744", Title: "Java语言", Author: &Author{Firstname: "Steve", Lastname: "Smith"}})
- books = append(books, Book{ID: "3", Isbn: "448745", Title: "java程序设计", Author: &Author{Firstname: "Steve", Lastname: "Smith"}})
- // 普通路由
- r.HandleFunc("/api/books", getBooks).Methods("GET")
- r.HandleFunc("/api2", getBooks).Methods("GET")
- r.HandleFunc("/api2/y", getBooks).Methods("GET")
- //子路由
- //http://127.0.0.1:8000/products/a
- s := r.PathPrefix("/products").Subrouter()
- s.HandleFunc("/a",getBooks)
- s.PathPrefix("/b").Subrouter().HandleFunc("/a",getBooks)
- // 普通路由参数
- //http://localhost:8000/api/books/2
- r.HandleFunc("/api/books/{id}", getBook).Methods("GET")
- //r.HandleFunc("/api/books/byTitle/{title}", getBookByTitle).Methods("GET")
- // 正则路由参数,title的查询限制为英文字母,并且是小写字母,否则报:404 page not found
- r.HandleFunc("/api/books/byTitle/{title:[a-z]+}", getBookByTitle).Methods("GET")
- r.HandleFunc("/api/books", createBook).Methods("POST")
- r.HandleFunc("/api/books/{id}", updateBook).Methods("PUT")
- r.HandleFunc("/api/books/{id}", deleteBook).Methods("DELETE")
- // 监听8000端口,并打出日志
- log.Fatal(http.ListenAndServe(":8000", r))
- }
- // 查询所有的Book
- func getBooks(w http.ResponseWriter, r *http.Request){
- w.Header().Set("Content-Type","application/json")
- w.WriteHeader(http.StatusOK)
- json.NewEncoder(w).Encode(books)
- }
- // 根据ID查询Book
- func getBook(w http.ResponseWriter, r *http.Request){
- w.Header().Set("Content-Type","application/json")
- params := mux.Vars(r) //map[string]string
- for _,item := range books {
- if item.ID == params["id"] {
- json.NewEncoder(w).Encode(item)
- w.WriteHeader(http.StatusOK)
- return
- }
- }
- w.WriteHeader(http.StatusNotFound)
- return
- }
- // 根据Title查询
- func getBookByTitle(w http.ResponseWriter, r *http.Request) {
- var newBooks []Book
- params := mux.Vars(r) // Get params
- for _, item := range books {
- if strings.Contains(item.Title, params["title"]) {
- newBooks = append(newBooks, item)
- }
- }
- if len(newBooks) == 0 {
- w.WriteHeader(http.StatusNotFound)
- return
- }
- w.WriteHeader(http.StatusOK)
- json.NewEncoder(w).Encode(newBooks)
- return
- }
- // 创建Book
- func createBook(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- var book Book
- _ = json.NewDecoder(r.Body).Decode(&book)
- book.ID = strconv.Itoa(rand.Intn(10000000)) // Mock ID - not safe
- books = append(books, book);
- json.NewEncoder(w).Encode(books)
- }
- // 修改Book
- func updateBook(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- params := mux.Vars(r) // Get params
- var book Book
- json.NewDecoder(r.Body).Decode(&book)
- for index, item := range books {
- if item.ID == params["id"] {
- books[index] = book
- books[index].ID = item.ID
- break
- }
- }
- json.NewEncoder(w).Encode(books)
- }
- // 删除Book
- func deleteBook(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- params := mux.Vars(r) // Get params
- for index, item := range books {
- if item.ID == params["id"] {
- books = append(books[:index], books[index+1:]...)
- break
- }
- }
- json.NewEncoder(w).Encode(books)
- }
|