Maison > développement back-end > Golang > Go Routing : Gestion et regroupement d'itinéraires avec net/http

Go Routing : Gestion et regroupement d'itinéraires avec net/http

Barbara Streisand
Libérer: 2024-11-03 05:15:02
original
811 Les gens l'ont consulté

Go Routing : Handling and Grouping Routes with net/http

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

  • Cela suppose que vous utilisez la version Go >= 1.22
  • Le repo pour plus de détails

Routage de base

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)
}
Copier après la connexion
Copier après la connexion

Passons en revue le code ci-dessus :

  1. router := http.NewServeMux() Cela crée un nouveau multiplexeur de requêtes. Lorsqu'une demande est effectuée, le routeur examine l'URL de la demande et sélectionne le gestionnaire le plus approprié pour traiter la demande.
  2. router.HandleFunc("GET /users/", getUsers) Ceci enregistre la route /users/ et indique qu'il s'agira d'une route de méthode GET.
  3. utils.WriteJSONResponse Il s'agit d'une fonction utilitaire permettant de créer une réponse JSON et peut être trouvée dans le dépôt dans utils/utils.go

Remarque : Lorsque vous effectuez des demandes, assurez-vous d'ajouter la barre oblique finale. Faire autrement renverra une réponse 404 introuvable
Exemple :

  • http://localhost:8000/users renvoie 404
  • http://localhost:8000/users/ renvoie la réponse correcte du serveur

Demande d'échantillon :

  • Demande : OBTENEZ http://localhost:8000/users/
  • Réponse :
// 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"
        }
    ]
}
Copier après la connexion
Copier après la connexion

Regroupement d'itinéraires

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
}
// ...
Copier après la connexion

Parcourons le code.

  1. func NewHandler() *Handler Cela crée un nouveau gestionnaire qui est utilisé pour l'injection de dépendances, comme l'ajout d'un accès à une base de données, le cas échéant.
  2. func (h *Handler) RegisterRoutes() *http.ServeMux Ici, nous créons un nouveau ServeMux et enregistrons les routes.
// 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)
}
Copier après la connexion
Copier après la connexion

Ici, nous allons nous concentrer sur la méthode Run.

  1. userHandler := user.NewHandler() Cela crée un nouveau gestionnaire et c'est le point où des éléments tels que les connexions à la base de données peuvent être transmis aux points de terminaison qui en ont besoin. C'est ce qu'on appelle l'injection de dépendances.
  2. userRouter := userHandler.RegisterRoutes() Cela crée un ServeMux contenant les routes utilisateur.
  3. router.Handle("/api/v1/users/", http.StripPrefix("/api/v1/users", userRouter)) Ceci enregistre les utilisateurs avec l'URL de base de /users/. StripPrefix supprime le préfixe spécifié de l'URL de la demande avant de l'acheminer vers userRouter.
// 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"
        }
    ]
}
Copier après la connexion
Copier après la connexion

« 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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal