Go 1.22 apporte deux améliorations au routeur du package net/http : la correspondance de méthodes et les caractères génériques. Ces fonctionnalités vous permettent d'exprimer des itinéraires courants sous forme de modèles au lieu de code Go. Bien qu'ils soient simples à expliquer et à utiliser, ce fut un défi de trouver les bonnes règles pour sélectionner le modèle gagnant lorsque plusieurs correspondent à une demande.
Go 1.22 a ajouté de nouvelles fonctionnalités à leur package net/http pour en faire une bonne alternative à l'utilisation de bibliothèques tierces. Dans cet article, nous verrons comment gérer le routage à l'aide du package net/http de Golang. Nous commencerons par la gestion de base des itinéraires, puis passerons au regroupement de ces itinéraires.
Remarques
Commençons par voir comment enregistrer vos itinéraires.
// 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) }
Passons en revue le code ci-dessus :
Remarque : Lorsque vous effectuez des demandes, assurez-vous d'ajouter la barre oblique finale. Faire autrement renverra une réponse 404 introuvable
Exemple :
Demande d'échantillon :
// 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" } ] }
Comme nous pouvons le voir ci-dessus, cela nous obligerait à enregistrer tous les points de terminaison au même endroit et peut rapidement devenir incontrôlable. Le regroupement des itinéraires vous aide à garder votre code organisé, évolutif et maintenable en regroupant les itinéraires et la logique associés. Il vous permet d'appliquer le middleware de manière sélective, encourage la réutilisabilité et améliore la lisibilité, en particulier à mesure que votre application se développe.
Voyons maintenant comment regrouper les itinéraires
Nous commencerons par enregistrer les routes localement dans le package où leurs fonctions de gestionnaire sont définies. L'étape suivante consiste à rassembler tous ces différents itinéraires et à démarrer le serveur.
// 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 } // ...
Parcourons le code.
// 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) }
Ici, nous allons nous concentrer sur la méthode 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" } ] }
« Avec Go 1.22, net/http est désormais plus polyvalent, proposant des modèles d'itinéraire qui améliorent la clarté et l'efficacité. Cette approche du regroupement des itinéraires montre à quel point il est facile de maintenir un code évolutif tout en tirant parti des capacités de routage intégrées de Go. » ChatGPT
Maintenant que nous avons réussi à regrouper les routes des utilisateurs. Clonez le dépôt et essayez d'ajouter un autre service.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!