"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment implémenter la prise en charge des caractères génériques dans le routage HTTP Go au-delà de « http.HandleFunc » ?

Comment implémenter la prise en charge des caractères génériques dans le routage HTTP Go au-delà de « http.HandleFunc » ?

Publié le 2024-12-22
Parcourir:628

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

Correspondance avancée de modèles de gestionnaire avec des caractères génériques à l'aide de gestionnaires personnalisés

Lors de l'utilisation de http.HandleFunc pour définir des modèles de routage dans Go, les mécanismes intégrés n'offre pas de support générique. Cela peut constituer un facteur limitant pour la capture de composants d'URL dynamiques.

Gestionnaire personnalisé avec correspondance de modèles d'expressions régulières

Pour surmonter cette limitation, il est possible de créer un gestionnaire personnalisé qui prend en charge la correspondance de modèles flexible à l'aide d'expressions régulières. Voici un exemple :

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

Utilisation :

Exemple d'utilisation du gestionnaire personnalisé pour gérer les URL avec des caractères génériques :

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

Cette approche vous permet de créer des modèles de routage flexibles au-delà des limites de http.HandleFunc tout en conservant le contrôle sur la logique de correspondance de chemin au sein du gestionnaire personnalisé.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3