2017-07-28 253 views
4

我一直在使用gorilla/mux作爲路由器的Go項目。Gorilla mux可選查詢值

我需要能夠具有與路線相關聯的查詢值,但這些值應該是可選的。 這意味着我想在同一處理程序中捕獲/articles/123/articles/123?key=456

爲了實現這樣我嘗試使用r.Queries方法接受鍵/值對: router. Path("/articles/{id:[0-9]+}"). Queries("key", "{[0-9]*?}") 但是這使得只有值(456)可選的,但是不是key。 因此/articles/123?key=456/articles/123?key=都是有效的,但不是/articles/123

編輯:另一個要求是,在註冊路由後,我想以編程方式構建它們,並且我似乎無法弄清楚如何使用r.Queries,即使文檔明確指出它可能(https://github.com/gorilla/mux#registered-urls) 。

@jmaloney答案的作品,但不允許從名稱建立網址。

+0

一種方法:https://stackoverflow.com/questions/43379942/how-to-have-an-optional-query-in-get-request-using-gorilla-mux – smarx

+0

@smarx我見過這個問題,但有兩個原因爲什麼它不適用於我: 1.它阻止我在我的處理程序中使用'mux.Vars(req)[「tab」]' 2.它不允許我按名稱構建註冊的URL(我已更新了該問題) – stassinari

回答

5

我只是註冊你的處理程序兩次。

router.Path("/articles/{id:[0-9]+}").Queries("key", "{[0- 
9]*?}").HandlerFunc(YourHandler).Name("YourHandler") 

router.Path("/articles/{id:[0-9]+}").HandlerFunc(YourHandler) 

這裏是一個工作程序來演示。請注意,我正在使用r.FormValue來獲取查詢參數。

注意:請確保您有一個最新版本go get -u github.com/gorilla/mux,因爲查詢參數的錯誤沒有得到添加,最近修復了構建的URL。

package main 

import (
    "fmt" 
    "log" 
    "net/http" 

    "github.com/gorilla/mux" 
) 

var router = mux.NewRouter() 

func main() { 
    router.Path("/articles/{id:[0-9]+}").Queries("key", "{key}").HandlerFunc(YourHandler).Name("YourHandler") 
    router.Path("/articles/{id:[0-9]+}").HandlerFunc(YourHandler) 

    if err := http.ListenAndServe(":9000", router); err != nil { 
     log.Fatal(err) 
    } 
} 

func YourHandler(w http.ResponseWriter, r *http.Request) { 
    id := mux.Vars(r)["id"] 
    key := r.FormValue("key") 

    u, err := router.Get("YourHandler").URL("id", id, "key", key) 
    if err != nil { 
     http.Error(w, err.Error(), 500) 
     return 
    } 

    // Output: 
    // /articles/10?key=[key] 
    w.Write([]byte(u.String())) 
} 
+0

我試圖做到這一點,並開始工作,即使我不知道它是否是黑客行爲。 唯一的問題是我想使用已註冊的URL來按名稱反向構建URL並使用它們處理查詢值,但似乎不起作用。我會更新這個問題。 – stassinari

+0

@stassinari我認爲我最近的編輯應該解決您的問題。 – jmaloney

+0

謝謝@ jmaloney,我能夠讓它工作。有一個問題:是否有一個原因,你使用'r.FormValue'而不是'mux.Vars'?我似乎能夠得到它的工作 – stassinari

0

如果您註冊查詢參數它們需要doc

在路由中定義的所有變量是必需的,它們的值必須符合相應的模式。

因爲這些參數是可選的,所以只需在處理函數中檢查它們:id, found := mux.Vars(r)["id"]。其中found將顯示查詢中是否有參數。