我一直在做一个Go项目,其中使用gorilla/mux作为路由器。
我需要能够将查询值与路由相关联,但这些值应该是可选的。这意味着我希望在同一个处理程序中同时捕获/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无效。
编辑:另一个要求是,在注册路由之后,我想以编程的方式构建它们,即使文档中明确指出可以使用(https://github.com/gorilla/mux#registered-urls),我似乎也不知道如何使用r.Queries。
@jmaloney answer可以工作,但不允许从名称构建URL。
发布于 2017-07-29 00:47:39
我只会给你的管理员注册两次。
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()))
}发布于 2017-07-29 02:25:16
如果注册查询参数,则这些参数是必需的doc
路由中定义的所有变量都是必填项,并且它们的值必须符合相应的模式。
因为这些参数是可选的,所以您只需要在处理程序函数id, found := mux.Vars(r)["id"]中检查它们。其中found将显示查询中是否包含该参数。
发布于 2020-12-01 10:32:23
似乎处理可选URL参数的最好方法是在没有URL参数的情况下正常定义路由器,然后像这样解析出可选参数:
urlParams := request.URL.Query()这将返回一个映射,其中包含以键/值对形式存在的URL参数。
https://stackoverflow.com/questions/45378566
复制相似问题