"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como implementar o suporte a curingas no roteamento Go HTTP além de `http.HandleFunc`?

Como implementar o suporte a curingas no roteamento Go HTTP além de `http.HandleFunc`?

Publicado em 2024-12-22
Navegar:550

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

Correspondência avançada de padrões de manipuladores com curingas usando manipuladores personalizados

Ao usar http.HandleFunc para definir padrões de roteamento em Go, os mecanismos integrados não ofereça suporte a curingas. Isso pode ser um fator limitante para a captura de componentes de URL dinâmicos.

Manipulador personalizado com correspondência de padrão de expressão regular

Para superar essa limitação, é possível criar um manipulador personalizado que oferece suporte à correspondência flexível de padrões usando expressões regulares. Aqui está um exemplo:

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

Uso:

Exemplo de uso do manipulador personalizado para lidar com URLs com padrões curinga:

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

Essa abordagem permite que você crie padrões de roteamento flexíveis além das limitações do http.HandleFunc enquanto mantém o controle sobre a lógica de correspondência de caminho dentro do manipulador personalizado.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3