„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie implementiert man Wildcard-Unterstützung im Go-HTTP-Routing über „http.HandleFunc“ hinaus?

Wie implementiert man Wildcard-Unterstützung im Go-HTTP-Routing über „http.HandleFunc“ hinaus?

Veröffentlicht am 22.12.2024
Durchsuche:908

How to Implement Wildcard Support in Go HTTP Routing Beyond `http.HandleFunc`?

Erweiterter Handler-Musterabgleich mit Platzhaltern mithilfe benutzerdefinierter Handler

Bei Verwendung von http.HandleFunc zum Definieren von Routing-Mustern in Go die integrierten Mechanismen Bieten Sie keine Wildcard-Unterstützung an. Dies kann ein einschränkender Faktor für die Erfassung dynamischer URL-Komponenten sein.

Benutzerdefinierter Handler mit Mustervergleich für reguläre Ausdrücke

Um diese Einschränkung zu überwinden, ist es möglich, einen benutzerdefinierten Handler zu erstellen unterstützt den flexiblen Mustervergleich mithilfe regulärer Ausdrücke. Hier ist ein Beispiel:

import (
    "net/http"
    "regexp"
)

type route struct {
    pattern *regexp.Regexp
    handler http.Handler
}

type RegexpHandler struct {
    routes []*route
}

// Handler adds a route to the custom handler.
func (h *RegexpHandler) Handler(pattern *regexp.Regexp, handler http.Handler) {
    h.routes = append(h.routes, &route{pattern, handler})
}

// HandleFunc adds a function-based route to the custom handler.
func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp, handler func(http.ResponseWriter, *http.Request)) {
    h.routes = append(h.routes, &route{pattern, http.HandlerFunc(handler)})
}

// ServeHTTP iterates through registered routes and checks if any pattern matches the request. If a match is found, the corresponding handler is invoked.
func (h *RegexpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    for _, route := range h.routes {
        if route.pattern.MatchString(r.URL.Path) {
            route.handler.ServeHTTP(w, r)
            return
        }
    }
    // No pattern matched, return a 404 response.
    http.NotFound(w, r)
}

Verwendung:

Beispielverwendung des benutzerdefinierten Handlers zur Verarbeitung von URLs mit Platzhaltermustern:

import (
    "log"
    "net/http"
)

func main() {
    rh := &RegexpHandler{}

    // Define a regular expression for capturing any valid URL string.
    pattern := regexp.MustCompile(`/groups/.*/people`)
    rh.HandleFunc(pattern, peopleInGroupHandler)

    // Start the web server and use the custom handler.
    log.Fatal(http.ListenAndServe(":8080", rh))
}

Mit diesem Ansatz können Sie flexible Routingmuster erstellen, die über die Einschränkungen von http.HandleFunc hinausgehen und gleichzeitig die Kontrolle über die Pfadvergleichslogik innerhalb des benutzerdefinierten Handlers behalten.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3