Go 1.22 bringt zwei Verbesserungen für den Router des Net/http-Pakets: Methodenabgleich und Platzhalter. Mit diesen Funktionen können Sie gängige Routen als Muster statt als Go-Code ausdrücken. Obwohl sie einfach zu erklären und zu verwenden sind, war es eine Herausforderung, die richtigen Regeln für die Auswahl des Gewinnermusters zu finden, wenn mehrere mit einer Anfrage übereinstimmen.
Go 1.22 hat seinem Net/http-Paket neue Funktionen hinzugefügt, um es zu einer guten Alternative zur Verwendung von Bibliotheken von Drittanbietern zu machen. In diesem Artikel werden wir uns mit der Handhabung des Routings mithilfe des net/http-Pakets von Golang befassen. Wir beginnen mit der grundlegenden Routenbearbeitung und fahren dann mit der Gruppierung dieser Routen fort.
Notizen
Beobachten wir zunächst, wie Sie Ihre Routen registrieren.
// 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) }
Lassen Sie uns den obigen Code durchgehen:
Hinweis: Achten Sie bei Anfragen darauf, den abschließenden Schrägstrich hinzuzufügen. Andernfalls wird die Antwort „404 nicht gefunden“ zurückgegeben
Beispiel:
Probenanfrage:
// 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" } ] }
Wie wir oben sehen können, müssten wir dazu alle Endpunkte am selben Ort registrieren, was schnell außer Kontrolle geraten kann. Durch das Gruppieren von Routen können Sie Ihren Code organisiert, skalierbar und wartbar halten, indem Sie verwandte Routen und Logik zusammenfassen. Es ermöglicht Ihnen die selektive Anwendung von Middleware, fördert die Wiederverwendbarkeit und verbessert die Lesbarkeit, insbesondere wenn Ihre Anwendung wächst.
Schauen wir uns nun an, wie wir Routen gruppieren können
Wir beginnen mit der lokalen Registrierung von Routen im Paket, in dem ihre Handlerfunktionen definiert sind. Der nächste Schritt besteht darin, all diese verschiedenen Routen zusammenzuführen und den Server zu starten.
// 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 } // ...
Lassen Sie uns den Code durchgehen.
// 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) }
Hier konzentrieren wir uns auf die Run-Methode.
// 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" } ] }
„Mit Go 1.22 ist net/http jetzt vielseitiger und bietet Routenmuster, die die Klarheit und Effizienz verbessern.“ Dieser Ansatz zur Gruppierung von Routen zeigt, wie einfach es ist, skalierbaren Code beizubehalten und gleichzeitig die Vorteile der integrierten Routing-Funktionen von Go zu nutzen.“ ChatGPT
Jetzt haben wir es geschafft, die Benutzerrouten zu gruppieren. Klonen Sie das Repo und versuchen Sie, einen weiteren Dienst hinzuzufügen.
Das obige ist der detaillierte Inhalt vonGo Routing: Routen mit net/http verwalten und gruppieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!