Bei der Registrierung von Handlern mit http.HandleFunc oder http.Handler ist es wünschenswert, Platzhalter im URL-Muster anzugeben, um mehrere Pfade abzugleichen . Beispielsweise möchte man möglicherweise einen Handler für alle Anfragen wie /groups/*/people definieren.
Leider unterstützt der Standardmustervergleich für HTTP-Handler in Go keine Platzhalter. Muster sind keine regulären Ausdrücke oder Globs, und es gibt keine integrierte Möglichkeit, Platzhalterpfade auszudrücken.
Eine Lösung besteht darin, benutzerdefinierte Handlerfunktionen zu generieren, die reguläre Ausdrücke verwenden, um komplexere Muster abzugleichen. Hier ist ein Beispiel für einen benutzerdefinierten Handler, der reguläre Ausdrücke unterstützt:
import ( "net/http" "regexp" ) type RegexpHandler struct { routes []*route } type route struct { pattern *regexp.Regexp handler http.Handler } func (h *RegexpHandler) Handler(pattern *regexp.Regexp, handler http.Handler) { h.routes = append(h.routes, &route{pattern, handler}) } func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp, handler func(http.ResponseWriter, *http.Request)) { h.routes = append(h.routes, &route{pattern, http.HandlerFunc(handler)}) } 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; send 404 response http.NotFound(w, r) }
Mit diesem benutzerdefinierten Handler können Sie ein reguläres Ausdrucksmuster definieren und es einer Handlerfunktion zuordnen. Wenn eine Anfrage eingeht, prüft der Handler den Anfragepfad anhand seiner Muster und leitet ihn an den zugehörigen Handler weiter, wenn eine Übereinstimmung gefunden wird.
Dieser Ansatz bietet zwar mehr Flexibilität, erfordert jedoch zusätzlichen Entwicklungsaufwand und führt zu einer Abhängigkeit von reguläre Ausdrücke. Dennoch ist es eine praktikable Option für den komplexen URL-Musterabgleich mit http.HandleFunc.
Das obige ist der detaillierte Inhalt vonWie kann ich den Wildcard-Abgleich für URL-Muster in den HTTP-Handlern von Go implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!