Gorilla mux可选查询值

时间:2017-07-28 16:42:09

标签: go gorilla mux

我一直致力于Go项目,其中gorilla / mux用作路由器。

我需要能够拥有与路由关联的查询值,但这些值应该是可选的。 这意味着我想在同一个处理程序中捕获/articles/123/articles/123?key=456

为了做到这一点,我尝试使用接受键/值对的r.Queries方法: 路由器。

  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。

3 个答案:

答案 0 :(得分:14)

我只会注册你的处理程序两次。

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,因为最近修复了未添加查询参数的错误。

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()))
}

答案 1 :(得分:2)

如果您注册查询参数,则需要doc

  

路径中定义的所有变量都是必需的,它们的值必须符合相应的模式。

因为这些参数是可选的,所以您只需要在处理函数内检查它们:id, found := mux.Vars(r)["id"]found将在查询中显示参数的位置。

答案 2 :(得分:0)

似乎最好的处理可选URL参数的方法是在没有路由器的情况下将其定义为普通路由器,然后解析出可选参数,如下所示:

urlParams := request.URL.Query()

这将返回一个包含URL参数作为键/值对的映射。