2014-02-09 7 views
5

Ich benutze das mux Paket, das scheint ziemlich gut zu funktionieren, außer dass es scheint nicht komplexe Routen zu unterstützen oder zumindest verstehe ich es nicht, wie es tut. Ich habe mehrere Routen, wie folgend:golang mux, routing wildcard & benutzerdefinierte func match

router := mux.NewRouter() 
router.HandleFunc("/{productid}/{code}", product) 
router.HandleFunc("/{user}", userHome) 
router.HandleFunc("/search/price", searchPage) 

So habe ich zwei Fragen:

  • Wie kann ich eine Wildcard Route so/Suche/Preis/* so, dass eine Anforderung solche/Suche definieren/Preis/29923/Wut/200/Farbe = rot kann es passen?

  • Ist es möglich, benutzerdefinierte Bedingungen zu einer bestehenden Route hinzuzufügen? z.B. Wenn die Route /{productid}/{code} ist und Funktion x true zurückgibt, verwenden Sie diese handlerTrue. Wenn sie false zurückgibt, verwenden Sie handlerFalse.

Ich habe versucht, so etwas wie .MatcherFunc(myfunction(ip)bool) auf die Route hinzuzufügen, aber es beschwert sich, dass der Router keine solche Methode hat.

Momentan handle ich die 'benutzerdefinierten' Bedingungen innerhalb des Handlers.

Antwort

0

Ich bin nicht ganz sicher, Sie brauchen eine „Wildcard“ Route überhaupt: Sie benötigen nur eine Route mit mehreren Parametern:

/search/price/{price}/rage/{id}/color funktionieren wird, dass die Abfrage-Strings unter Hinweis darauf, brauchen nicht in die aufgenommen werden Matcher (Sie Zugriff auf diejenigen über request.URL.Query, während Sie die Mux-Variablen über mux.Vars zugreifen. Sie auch regex die akzeptierten Parameter verengen können.

Es wird auch durch das Vorsetzen ihnen vielleicht helfen, Ihre Benutzer und Produktwege zu unterscheiden mit /user/{id} und /products/{id}/{code} (insbesondere für Semantik)

So weit MatcherFunc geht, müssen Sie sicherstellen, dass Ihre Funktion die gleiche Signatur wie MatcherFunc verwendet (was ein Typ ist): func MatchIPAddresses(*http.Request, *RouteMatch) bool würde es lösen. Sie können auf die IP-Adresse über die Struktur Request zugreifen, indem Sie r.RemoteAddr oder r.Header.Get("X-Forwarded-For") überprüfen, wenn Sie erwarten, dass Sie hinter einem Proxy-Server stehen. Ich überprüfe normalerweise beide, wenn man leer ist ("").

d (rau;! Sie können diese ein wenig aufzuräumen)

func MatchIPAddresses(r *http.Request, rm *RouteMatch) bool { 
    if r.RemoteAddr == 8.8.8.8 { 
     return true 
    } else if r.Header.Get("X-Forwarded-For") == 8.8.8.8 { 
     return true 
    } 

    return false 
} 
+0

undefined: RouteMatch, kann meine Funktion nicht verwenden (, * RouteMatch) (Typ bool) als Typ mux.MatcherFunc in Funktion Argument – themihai

+1

Ich habe mein Beispiel behoben. Ich empfehle auch sehr, die Gorilla Mux Dokumente zu lesen, die ein ähnliches Beispiel haben, wie man einen MatcherFunc ungefähr auf halber Seite schreibt: http://www.gorillatoolkit.org/pkg/mux – elithrar

+0

Ich habe die Dokumente vor dem Posten gelesen die Frage. Ich denke, Ihre Antwort wird im Grunde aus den Dokumenten kopiert, mit Ausnahme der IP-Funktion. – themihai

7

können Sie regexps verwenden. So etwas wie

router.HandleFunc(`/search/price/{rest:[a-zA-Z0-9=\-\/]+}`, searchPage) 

Auf diese Weise rest wird einfach alles erfassen, so in Ihrem Beispiel rest29923/rage/200/color=red wäre. Sie müssen das in Ihrem Code analysieren.

Sie wollen wahrscheinlich einige wie optionale Argumente, obwohl.

router.HandleFunc(`/search{price:(\/price\/[0-9]+)?}{rage:(\/rage\/[0-9]+)?}{color:(\/color=[a-z]+)?}`, searchPage) 

Danach erhalten Sie Vars price = "/price/29923", rage = "/rage/200" und color = "/color=red", dass Sie immer noch analysieren müssen, aber es einfacher, und Sie erhalten zu steuern, welche Parameter gültig sind. Es funktioniert wie erwartet, wenn Sie einige Parameter überspringen, z./search/price/29923/color=red wird nur eine leere rage Variable geben, aber immer noch übereinstimmen.

Ich verstehe nicht ganz Ihre zweite Frage.

+0

Entschuldigung. Für die zweite Lösung, die Teilausdrücke miteinbezieht, denke ich, dass Sie diese Gabel des Mux benötigen würden: https://github.com/gorilla/mux/pull/11 das ist, was ich in meinem letzten Projekt verwendete. –

+0

der Regex löst einen Fehler aus: "unbekannte Escapesequenz" – themihai

+0

Ja, "" sollte "' sein. Bearbeitet. –