web-dev-qa-db-ja.com

Gorilla muxのオプションのクエリ値

ゴリラ/ 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を作成することはできません。

10
stassinari

ハンドラーを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()))
}
17
jmaloney

クエリパラメータを登録する場合は必須です doc

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

これらのパラメーターはオプションであるため、ハンドラー関数id, found := mux.Vars(r)["id"]内で確認する必要があります。 foundは、クエリ内のパラメーターの有無を示します。

3
Pavlo Strokov