Gorilla mux 可选查询值

新手上路,请多包涵

我一直在做一个使用 gorilla/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。

原文由 stassinari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 521
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()))
}

原文由 jmaloney 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您注册查询参数,则它们是必需的 文档

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

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

原文由 Pavlo Strokov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏