Go 1.22 為 net/http 套件的路由器帶來了兩個增強:方法匹配和通配符。這些功能可讓您將常見的路由表達為模式而不是 Go 代碼。雖然它們解釋和使用起來很簡單,但當多個匹配請求時,想出正確的規則來選擇獲勝模式是一個挑戰。
Go 1.22 在其 net/http 套件中新增了功能,使其成為使用第三方函式庫的良好替代方案。在本文中,我們將了解如何使用 Golang 的 net/http 套件處理路由。我們將從基本的路線處理開始,然後繼續對這些路線進行分組。
筆記
讓我們先了解如何註冊您的路線。
// main.go package main import ( "log" "net/http" ) func main() { router := http.NewServeMux() router.HandleFunc("GET /users/", getUsers) router.HandleFunc("POST /users/", createUser) router.HandleFunc("GET /users/{id}/", getUser) router.HandleFunc("DELETE /users/{id}/", deleteUser) err := http.ListenAndServe(":8000", router) if err != nil { log.Fatal(err) } } // Here goes the implementation for getUsers, getUser, createUser, deleteUser // Check the repo in services/users/routes.go type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` } var users []User = []User{ {ID: 1, Name: "Bumblebee", Email: "bumblebee@autobots.com"}, {ID: 2, Name: "Optimus Prime", Email: "optimus.prime@autobots.com"}, {ID: 3, Name: "Ironhide", Email: "ironhide@autobots.com"}, {ID: 4, Name: "Hot Rod", Email: "hot.rod@autobots.com"}, } func getUsers(w http.ResponseWriter, r *http.Request) { response := map[string]any{ "message": "Done", "users": users, } utils.WriteJSONResponse(w, http.StatusOK, response) }
讓我們來看看上面的程式碼:
注意: 提出請求時,請確保添加尾部斜線。否則將返回 404 未找到回應
例:
樣品請求:
// statusCode: 200 { "message": "Done", "users": [ { "id": 1, "name": "Bumblebee", "email": "bumblebee@autobots.com" }, { "id": 2, "name": "Optimus Prime", "email": "optimus.prime@autobots.com" }, { "id": 3, "name": "Ironhide", "email": "ironhide@autobots.com" }, { "id": 4, "name": "Hot Rod", "email": "hot.rod@autobots.com" } ] }
從上面我們可以看出,這需要我們在同一個地方註冊所有端點,並且很快就會失控。透過將相關的路由和邏輯放在一起,將路由分組可以幫助您保持程式碼的組織性、可擴展性和可維護性。它允許您有選擇地應用中間件,鼓勵可重複使用性並提高可讀性,特別是隨著您的應用程式的成長。
現在讓我們來看看如何將路線分組
我們將首先在定義其處理函數的套件中本地註冊路由。下一步是將所有這些不同的路線整合在一起並啟動伺服器。
// services/users/routes.go package user import ( "fmt" "net/http" "strconv" "<your-project-name>/gorouting/utils" ) type Handler struct{} func NewHandler() *Handler { return &Handler{} } func (h *Handler) RegisterRoutes() *http.ServeMux { r := http.NewServeMux() r.HandleFunc("GET /", getUsers) r.HandleFunc("POST /", createUser) r.HandleFunc("GET /{id}/", getUser) r.HandleFunc("DELETE /{id}/", deleteUser) return r } // ...
讓我們來看看程式碼。
// main.go package main import ( "log" "net/http" ) func main() { router := http.NewServeMux() router.HandleFunc("GET /users/", getUsers) router.HandleFunc("POST /users/", createUser) router.HandleFunc("GET /users/{id}/", getUser) router.HandleFunc("DELETE /users/{id}/", deleteUser) err := http.ListenAndServe(":8000", router) if err != nil { log.Fatal(err) } } // Here goes the implementation for getUsers, getUser, createUser, deleteUser // Check the repo in services/users/routes.go type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` } var users []User = []User{ {ID: 1, Name: "Bumblebee", Email: "bumblebee@autobots.com"}, {ID: 2, Name: "Optimus Prime", Email: "optimus.prime@autobots.com"}, {ID: 3, Name: "Ironhide", Email: "ironhide@autobots.com"}, {ID: 4, Name: "Hot Rod", Email: "hot.rod@autobots.com"}, } func getUsers(w http.ResponseWriter, r *http.Request) { response := map[string]any{ "message": "Done", "users": users, } utils.WriteJSONResponse(w, http.StatusOK, response) }
這裡我們將重點放在 Run 方法上。
// statusCode: 200 { "message": "Done", "users": [ { "id": 1, "name": "Bumblebee", "email": "bumblebee@autobots.com" }, { "id": 2, "name": "Optimus Prime", "email": "optimus.prime@autobots.com" }, { "id": 3, "name": "Ironhide", "email": "ironhide@autobots.com" }, { "id": 4, "name": "Hot Rod", "email": "hot.rod@autobots.com" } ] }
「在Go 1.22 中,net/http 現在更加通用,提供了提高清晰度和效率的路由模式。這種路由分組方法顯示了在利用Go 內建路由功能的同時維護可擴展程式碼是多麼容易。 」聊天GPT
現在我們已經成功地對使用者路線進行了分組。克隆存儲庫並嘗試添加另一個服務。
以上是Go 路由:使用 net/http 處理和分組路由的詳細內容。更多資訊請關注PHP中文網其他相關文章!