Heim >Backend-Entwicklung >Golang >Go Routing: Routen mit net/http verwalten und gruppieren

Go Routing: Routen mit net/http verwalten und gruppieren

Barbara Streisand
Barbara StreisandOriginal
2024-11-03 05:15:02813Durchsuche

Go Routing : Handling and Grouping Routes with net/http

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

  • Dies setzt voraus, dass Sie die Go-Version >= 1.22 verwenden
  • Das Repo für weitere Details

Grundlegendes Routing

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:

  1. router := http.NewServeMux() Dadurch wird ein neuer Anforderungsmultiplexer erstellt. Wenn eine Anfrage gestellt wird, prüft der Router die URL der Anfrage und wählt den am besten geeigneten Handler zur Bearbeitung der Anfrage aus.
  2. router.HandleFunc("GET /users/", getUsers) Dies registriert die /users/-Route und gibt an, dass es sich um eine GET-Methodenroute handelt.
  3. utils.WriteJSONResponse Dies ist eine Dienstprogrammfunktion zum Erstellen einer JSON-Antwort und kann im Repo in utils/utils.go gefunden werden

Hinweis: Achten Sie bei Anfragen darauf, den abschließenden Schrägstrich hinzuzufügen. Andernfalls wird die Antwort „404 nicht gefunden“ zurückgegeben
Beispiel:

  • http://localhost:8000/users gibt 404
  • zurück
  • http://localhost:8000/users/ gibt die richtige Serverantwort zurück

Probenanfrage:

  • Anfrage: GET http://localhost:8000/users/
  • Antwort:
// 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"
        }
    ]
}

Gruppieren von Routen

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.

  1. func NewHandler() *Handler Dies erstellt einen neuen Handler, der für die Abhängigkeitsinjektion verwendet wird, z. B. das Hinzufügen des Zugriffs auf eine Datenbank, falls eine vorhanden ist.
  2. func (h *Handler) RegisterRoutes() *http.ServeMux Hier erstellen wir einen neuen ServeMux und registrieren Routen.
// 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.

  1. userHandler := user.NewHandler() Dadurch wird ein neuer Handler erstellt und dies ist der Punkt, an dem Dinge wie Datenbankverbindungen an die Endpunkte weitergeleitet werden können, die sie benötigen. Dies wird als Abhängigkeitsinjektion bezeichnet.
  2. userRouter := userHandler.RegisterRoutes() Dadurch wird ein ServeMux erstellt, der die Benutzerrouten enthält.
  3. router.Handle("/api/v1/users/", http.StripPrefix("/api/v1/users", userRouter)) Dadurch werden die Benutzer mit der Basis-URL /users/ registriert. StripPrefix entfernt das angegebene Präfix aus der Anforderungs-URL, bevor es an userRouter weitergeleitet wird.
// 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn