2017-07-20 3 views
3

filtern Ich möchte nur einige Routen von einem mux.Router übereinstimmen, und verwenden Sie den gleichen Handler für alle anderen. Wie kann ich das machen?Wie ein Pfad von Gorilla mux.Router

d.h .: mit diesen Wegen:

/general/baz/bro 
/general/foo/bar 
/general/unknown 

Ich möchte die erste mit einem bestimmten Handler übereinstimmen, und alle anderen mit einem Standard-Handler.

Ich habe versucht, ohne Erfolg so etwas wie:

r.Methods("GET").PathPrefix("/general").Handler(defaultHandler) 
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler) 

ich die bazBroHandler erwartet Umgang mit dem /general/baz/bro Weg und die Default alle anderen mit Start-/general

+0

Sie können regexp versuchen. Ich nehme an, es ist kein ideomatischer Weg, aber es könnte wahrscheinlich helfen: 'get: = repo.Methods (" GET "). Subrouter()' 'get.Handle ("/general/baz/bro ", bazBroHandler) ' ' get.Handle ("/ general/{unbekannt: [0-9A-Za-z] +}", defaultHandler) ' – bayrinat

Antwort

0

Am Ende habe ich gemerkt, dass ich den Auftrag invertieren benötigt:

r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler) 
r.Methods("GET").PathPrefix("/general").Handler(defaultHandler) 

jetzt alles funktioniert!

0

Eine Möglichkeit, dies zu erreichen ist mit MatcherFunc. Im MatcherFunc, vergleichen/überprüfen Sie die eingehende Anfrage Path, d.h .:

//Default handler 
r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool { 
    return r.URL.Path != "/general/baz/bro" && strings.HasPrefix(r.URL.Path, "/general") && r.Method == "GET" 
}).Handler(defaultHandler) 

//Specific handler 
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)