Maison  >  Article  >  développement back-end  >  Comment puis-je implémenter la correspondance par caractères génériques pour les modèles d'URL dans les gestionnaires HTTP de Go ?

Comment puis-je implémenter la correspondance par caractères génériques pour les modèles d'URL dans les gestionnaires HTTP de Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 19:24:02820parcourir

How can I implement wildcard matching for URL patterns in Go's HTTP handlers?

Caractères génériques dans les modèles d'URL pour les gestionnaires HTTP

Lors de l'enregistrement des gestionnaires avec http.HandleFunc ou http.Handler, il est souhaitable de spécifier des caractères génériques dans le modèle d'URL pour faire correspondre plusieurs chemins . Par exemple, on pourrait vouloir définir un gestionnaire pour toutes les requêtes comme /groups/*/people.

Malheureusement, la correspondance de modèle par défaut pour les gestionnaires HTTP dans Go ne prend pas en charge les caractères génériques. Les modèles ne sont pas des expressions régulières ou des globs, et il n'existe aucun moyen intégré d'exprimer des chemins génériques.

Une solution consiste à générer des fonctions de gestionnaire personnalisées qui utilisent des expressions régulières pour correspondre à des modèles plus complexes. Voici un exemple de gestionnaire personnalisé prenant en charge les expressions régulières :

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)
}

Ce gestionnaire personnalisé vous permet de définir un modèle d'expression régulière et de l'associer à une fonction de gestionnaire. Lorsqu'une requête arrive, le gestionnaire vérifie le chemin de la requête par rapport à ses modèles et l'envoie au gestionnaire associé si une correspondance est trouvée.

Bien que cette approche offre une plus grande flexibilité, elle nécessite un effort de développement supplémentaire et introduit une dépendance sur expressions régulières. Néanmoins, il s'agit d'une option viable pour la correspondance de modèles d'URL complexes avec http.HandleFunc.

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!

Déclaration:
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