80 votes

Caractères génériques dans le modèle pour http.HandleFunc

Lorsque vous enregistrez des gestionnaires dans Go (langue), existe-t-il un moyen de spécifier des caractères génériques dans le modèle?

Par exemple:

 http.HandleFunc("/groups/*/people", peopleInGroupHandler)
 

* pourrait être n'importe quelle chaîne d'URL valide. Ou est-ce la seule solution pour faire correspondre /groups et calculer le reste à partir du gestionnaire ( peopleInGroupHandler )?

99voto

Evan Shaw Points 7957

Les modèles pour http.Handler et http.HandleFunc ne sont pas des expressions régulières ou des globs. Il n'y a pas de moyen de spécifier des caractères génériques. Ils sont documentés ici .

Cela dit, il n’est pas très difficile de créer votre propre gestionnaire qui peut utiliser des expressions régulières ou tout autre type de modèle souhaité. En voici un qui utilise des expressions régulières (compilées, mais non testées):

 type route struct {
    pattern *regexp.Regexp
    handler http.Handler
}

type RegexpHandler struct {
    routes []*route
}

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

61voto

VonC Points 414372

Depuis 2011, vous pouvez maintenant (2014+) trouver d'autres solutions.
Par exemple, le mux package du Gorille Web toolkit fournit toutes sortes d'options de routage:

  • Le Pattern matching sur demande chemins, avec une option d'expressions régulières.
  • Correspondance sur l'URL de l'hôte et le système, la méthode de requête, en-tête de requête et de valeurs.
  • Le Matching basé sur des fonctions personnalisées.
  • L'utilisation de sous-routeurs pour faciliter la gamme imbriquée.

Il peut être facilement intégré à n'importe BYOR (Apportez votre propre Routeur) http bibliothèque, comme le negroni.

Voici un exemple à partir de l'article "Gorilla vs Pat vs Itinéraires: Un Mux épreuve de force":

package main

import (
  "github.com/gorilla/mux"
  "log"
  "net/http"
)

func main() {
  rtr := mux.NewRouter()
  rtr.HandleFunc("/user/{name:[a-z]+}/profile", profile).Methods("GET")

  http.Handle("/", rtr)

  log.Println("Listening...")
  http.ListenAndServe(":3000", nil)
}

func profile(w http.ResponseWriter, r *http.Request) {
  params := mux.Vars(r)
  name := params["name"]
  w.Write([]byte("Hello " + name))
}

-12voto

Francois Points 181

Beego, la réponse à toutes les questions du serveur Web Golang. Wetalk est un site de blog construit sur Beego.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X