2014-02-09 101 views
5

我使用的是mux軟件包,似乎工作得很好,除了它似乎不支持複雜的路由或至少我不明白它是如何做到的。 我有幾個途徑如下:golang多路複用器,路由通配符和自定義func匹配

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

所以我有兩個問題:

  • 我如何定義一個通配符路徑,例如/搜索/價格/ *,這樣的請求,例如/搜索/價格/ 29923 /憤怒/ 200 /顏色=紅色可以匹配嗎?

  • 是否可以向現有路線添加自定義條件?例如如果路線是/{productid}/{code}且功能x返回true,則使用此handlerTrue,如果它返回false使用handlerFalse

我試着像.MatcherFunc(myfunction(ip)bool)添加了一些路線,但它抱怨路由器有沒有這樣的方法。

目前我正在處理處理程序中的'自定義'條件。

回答

0

我不太清楚你需要一個「通配符」路線都:你只需要使用多個參數的路線:

/search/price/{price}/rage/{id}/color會的工作,並指出,查詢字符串不需要被列入匹配(您通過request.URL.Query訪問這些,而你通過mux.Vars訪問MUX變量。您還可以使用正則表達式來縮小接受參數。

這也將有助於區分用戶和產品路線,或許用前綴/user/{id}/products/{id}/{code}(特別是語義)

只要MatcherFunc去,你需要確保你的函數使用相同的簽名作爲MatcherFunc(這是一種類型):func MatchIPAddresses(*http.Request, *RouteMatch) bool將解決它。如果您希望位於代理之後,則可以通過檢查r.RemoteAddrr.Header.Get("X-Forwarded-For")來通過Request結構訪問IP地址。我通常檢查兩者是否爲空("")。

即(粗糙;!你可以清理這個了一下)

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,不能在函數參數 – themihai

+1

中使用myfunction(,* RouteMatch)(類型bool)作爲類型mux.MatcherFunc我修正了我的示例。我也強烈推薦閱讀Gorilla Mux docs,它有一個類似的例子,介紹如何在頁面的一半處編寫一個MatcherFunc:http://www.gorillatoolkit.org/pkg/mux – elithrar

+0

我在閱讀文檔之前發佈這個問題。我認爲你的答案基本上是從文檔複製,除了ip功能。 – themihai

7

您可以使用正則表達式。像

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

這樣,rest東西只會捕捉一切,所以在你的榜樣rest29923/rage/200/color=red。你需要在你的代碼中解析它。

雖然你可能想要一些像可選參數。

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

之後,你會得到瓦爾price = "/price/29923"rage = "/rage/200"color = "/color=red",你還需要分析,但它更容易,你能控制哪些參數是有效的。它可以按預期工作,如果你跳過一些參數,例如。/search/price/29923/color=red只會給出一個空的rage變量,但仍然匹配。

我不太明白你的第二個問題。

+0

對不起。對於涉及子表達式的第二種解決方案,我認爲你需要這個多路複用器的分支:https://github.com/gorilla/mux/pull/11這是我在上一個項目中使用的。 –

+0

正則表達式拋出一個錯誤:「未知的轉義序列」 – themihai

+0

是的,「」應該是''。編輯。 –