2017-07-28 8 views
4

私はgorilla/muxがルータとして使用されるGoプロジェクトに取り組んできました。Gorilla muxのオプションのクエリ値

ルートに関連付けられたクエリ値を持つことができる必要がありますが、これらの値はオプションでなければなりません。 つまり、同じハンドラで/articles/123/articles/123?key=456の両方をキャッチしたいと考えています。

ので、私は、キー/値のペアを受け入れr.Queries方法使用してみました達成するために:key router. Path("/articles/{id:[0-9]+}"). Queries("key", "{[0-9]*?}") をこれが唯一の値(456)を行うオプションではなく、。 /articles/123?key=456/articles/123?key=の両方が有効ですが、/articles/123では無効です。

編集:ルートを登録した後、プログラムでビルドしたいと思っていますが、を使用する方法を考えることができません。ドキュメントには具体的には可能です(https://github.com/gorilla/mux#registered-urls) 。

@jmaloney answerは動作しますが、名前からURLを構築することはできません。

+0

1つのアプローチ:https://stackoverflow.com/questions/43379942/how-to-have-an-optional-query-in-get-request-using-gorilla-mux – smarx

+0

@smarx私はその質問を見ました私にはうまくいかない理由は2つあります: 1.ハンドラで 'mux.Vars(req)[" tab "]'を使用することを妨げます 2.それは私に許可しません登録されたURLを名前でビルドする(質問を更新しました) – stassinari

答えて

5

ハンドラを2回登録するだけです。

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ありがとう、私はそれを働かせることができました。しかし、1つの質問: 'mux.Vars'の代わりに' r.FormValue'を使う理由はありますか?私はそれを働かせることができるようです – stassinari

0

あなたは彼らがdoc必要とされているクエリパラメータ登録する場合:

をルートに定義されたすべての変数が必要であり、その値は、対応するパターンに従っている必要があります。

これらのパラメータはオプションなので、ハンドラ関数内でチェックする必要があります。id, found := mux.Vars(r)["id"]。 Where foundは、クエリのパラメータが表示されるかどうかを示します。

関連する問題