Maison > développement back-end > Golang > Pouvez-vous utiliser des caractères génériques dans les modèles « http.HandleFunc » ?

Pouvez-vous utiliser des caractères génériques dans les modèles « http.HandleFunc » ?

DDD
Libérer: 2024-11-24 09:37:10
original
430 Les gens l'ont consulté

Can You Use Wildcards in `http.HandleFunc` Patterns?

Modèles de gestionnaire dans le serveur HTTP

Lors de l'utilisation de http.HandleFunc, la question se pose de savoir s'il est possible d'incorporer des caractères génériques dans le modèle. Par exemple, vous pouvez souhaiter un modèle tel que "/groups//people" où l'astérisque () représente tout segment d'URL valide.

Limitations du modèle de gestionnaire HTTP

Malheureusement, les modèles http.Handler ne sont pas des expressions régulières ou des globs, donc les caractères génériques ne peuvent pas être directement spécifié.

Gestionnaire personnalisé pour la flexibilité des modèles

Pour surmonter cette limitation, envisagez de créer un gestionnaire HTTP personnalisé qui exploite les expressions régulières ou d'autres modèles souhaités. Voici un exemple avec des expressions régulières :

import (
    "net/http"
    "regexp"
)

type RegexpHandler struct {
    routes []*route
}
type route struct {
    pattern *regexp.Regexp
    handler http.Handler
}

// Register handlers with custom patterns
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)})
}

// Process HTTP requests and route to appropriate handler based on custom patterns
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 404
    http.NotFound(w, r)
}

func NewRegexpHandler() *RegexpHandler {
    return &RegexpHandler{routes: make([]*route, 0)}
}
Copier après la connexion

Ce gestionnaire vous permet d'enregistrer des modèles et des gestionnaires personnalisés, offrant ainsi la flexibilité de faire correspondre les URL de manière plus dynamique. Il peut être intégré de manière transparente au serveur HTTP par défaut :

http.Handle("/", NewRegexpHandler())
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal