ゴリラ/ muxをルーターとして使用するGoプロジェクトに取り組んでいます。
ルートにクエリ値を関連付ける必要がありますが、これらの値はオプションである必要があります。つまり、同じハンドラーで/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の回答は機能しますが、名前からURLを作成することはできません。
ハンドラーを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
を使用してクエリパラメータを取得していることに注意してください。
注:クエリパラメータのバグがビルドURLに追加されないというバグが最近修正されたため、最新バージョンgo get -u github.com/gorilla/mux
があることを確認してください。
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()))
}
クエリパラメータを登録する場合は必須です doc :
ルートで定義されたすべての変数が必要であり、それらの値は対応するパターンに準拠する必要があります。
これらのパラメーターはオプションであるため、ハンドラー関数id, found := mux.Vars(r)["id"]
内で確認する必要があります。 found
は、クエリ内のパラメーターの有無を示します。