main.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package main
  2. import (
  3. "encoding/json"
  4. "github.com/gorilla/mux"
  5. "log"
  6. "math/rand"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. )
  11. type Book struct {
  12. ID string `json:"id"`
  13. Isbn string `json:"isbn"`
  14. Title string `json:"title"`
  15. Author *Author `json:"author"`
  16. }
  17. type Author struct {
  18. Firstname string `json:"firstname"`
  19. Lastname string `json:"lastname"`
  20. }
  21. // 初始化book的切片
  22. var books []Book
  23. func main() {
  24. // 初始化路由
  25. r := mux.NewRouter()
  26. // 增加mock数据
  27. books = append(books, Book{ID: "1", Isbn: "448743", Title: "Go语言", Author: &Author{Firstname: "John", Lastname: "Doe"}})
  28. books = append(books, Book{ID: "2", Isbn: "448744", Title: "Java语言", Author: &Author{Firstname: "Steve", Lastname: "Smith"}})
  29. books = append(books, Book{ID: "3", Isbn: "448745", Title: "java程序设计", Author: &Author{Firstname: "Steve", Lastname: "Smith"}})
  30. // 普通路由
  31. r.HandleFunc("/api/books", getBooks).Methods("GET")
  32. r.HandleFunc("/api2", getBooks).Methods("GET")
  33. r.HandleFunc("/api2/y", getBooks).Methods("GET")
  34. //子路由
  35. //http://127.0.0.1:8000/products/a
  36. s := r.PathPrefix("/products").Subrouter()
  37. s.HandleFunc("/a",getBooks)
  38. s.PathPrefix("/b").Subrouter().HandleFunc("/a",getBooks)
  39. // 普通路由参数
  40. //http://localhost:8000/api/books/2
  41. r.HandleFunc("/api/books/{id}", getBook).Methods("GET")
  42. //r.HandleFunc("/api/books/byTitle/{title}", getBookByTitle).Methods("GET")
  43. // 正则路由参数,title的查询限制为英文字母,并且是小写字母,否则报:404 page not found
  44. r.HandleFunc("/api/books/byTitle/{title:[a-z]+}", getBookByTitle).Methods("GET")
  45. r.HandleFunc("/api/books", createBook).Methods("POST")
  46. r.HandleFunc("/api/books/{id}", updateBook).Methods("PUT")
  47. r.HandleFunc("/api/books/{id}", deleteBook).Methods("DELETE")
  48. // 监听8000端口,并打出日志
  49. log.Fatal(http.ListenAndServe(":8000", r))
  50. }
  51. // 查询所有的Book
  52. func getBooks(w http.ResponseWriter, r *http.Request){
  53. w.Header().Set("Content-Type","application/json")
  54. w.WriteHeader(http.StatusOK)
  55. json.NewEncoder(w).Encode(books)
  56. }
  57. // 根据ID查询Book
  58. func getBook(w http.ResponseWriter, r *http.Request){
  59. w.Header().Set("Content-Type","application/json")
  60. params := mux.Vars(r) //map[string]string
  61. for _,item := range books {
  62. if item.ID == params["id"] {
  63. json.NewEncoder(w).Encode(item)
  64. w.WriteHeader(http.StatusOK)
  65. return
  66. }
  67. }
  68. w.WriteHeader(http.StatusNotFound)
  69. return
  70. }
  71. // 根据Title查询
  72. func getBookByTitle(w http.ResponseWriter, r *http.Request) {
  73. var newBooks []Book
  74. params := mux.Vars(r) // Get params
  75. for _, item := range books {
  76. if strings.Contains(item.Title, params["title"]) {
  77. newBooks = append(newBooks, item)
  78. }
  79. }
  80. if len(newBooks) == 0 {
  81. w.WriteHeader(http.StatusNotFound)
  82. return
  83. }
  84. w.WriteHeader(http.StatusOK)
  85. json.NewEncoder(w).Encode(newBooks)
  86. return
  87. }
  88. // 创建Book
  89. func createBook(w http.ResponseWriter, r *http.Request) {
  90. w.Header().Set("Content-Type", "application/json")
  91. var book Book
  92. _ = json.NewDecoder(r.Body).Decode(&book)
  93. book.ID = strconv.Itoa(rand.Intn(10000000)) // Mock ID - not safe
  94. books = append(books, book);
  95. json.NewEncoder(w).Encode(books)
  96. }
  97. // 修改Book
  98. func updateBook(w http.ResponseWriter, r *http.Request) {
  99. w.Header().Set("Content-Type", "application/json")
  100. params := mux.Vars(r) // Get params
  101. var book Book
  102. json.NewDecoder(r.Body).Decode(&book)
  103. for index, item := range books {
  104. if item.ID == params["id"] {
  105. books[index] = book
  106. books[index].ID = item.ID
  107. break
  108. }
  109. }
  110. json.NewEncoder(w).Encode(books)
  111. }
  112. // 删除Book
  113. func deleteBook(w http.ResponseWriter, r *http.Request) {
  114. w.Header().Set("Content-Type", "application/json")
  115. params := mux.Vars(r) // Get params
  116. for index, item := range books {
  117. if item.ID == params["id"] {
  118. books = append(books[:index], books[index+1:]...)
  119. break
  120. }
  121. }
  122. json.NewEncoder(w).Encode(books)
  123. }