Gorilla mux 可选查询值
Gorilla mux optional query values
我一直在做一个 Go 项目,其中 gorilla/mux 被用作路由器。
我需要能够拥有与路线关联的查询值,但这些值应该是可选的。
这意味着我想在同一个处理程序中捕获 /articles/123
和 /articles/123?key=456
。
为此,我尝试使用接受 key/value 对的 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。
我只想注册你的处理程序两次。
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()))
}
如果您注册查询参数,则它们是必需的 doc:
All variables defined in the route are required, and their values must conform to the corresponding patterns.
因为这些参数是可选的,所以您只需要在处理函数中检查它们:id, found := mux.Vars(r)["id"]
。其中 found
将显示参数是否在查询中。
似乎处理可选 URL参数的最佳方法是将路由器定义为没有它们的正常情况,然后像这样解析可选参数:
urlParams := request.URL.Query()
这个 returns 包含 URL 参数的映射 Key/Value 对。
我一直在做一个 Go 项目,其中 gorilla/mux 被用作路由器。
我需要能够拥有与路线关联的查询值,但这些值应该是可选的。
这意味着我想在同一个处理程序中捕获 /articles/123
和 /articles/123?key=456
。
为此,我尝试使用接受 key/value 对的 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。
我只想注册你的处理程序两次。
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()))
}
如果您注册查询参数,则它们是必需的 doc:
All variables defined in the route are required, and their values must conform to the corresponding patterns.
因为这些参数是可选的,所以您只需要在处理函数中检查它们:id, found := mux.Vars(r)["id"]
。其中 found
将显示参数是否在查询中。
似乎处理可选 URL参数的最佳方法是将路由器定义为没有它们的正常情况,然后像这样解析可选参数:
urlParams := request.URL.Query()
这个 returns 包含 URL 参数的映射 Key/Value 对。