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中文网其他相关文章!