作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我一直在做一个使用 gorilla/mux 作为路由器的 Go 项目。
我需要能够将查询值与路由关联,但这些值应该是可选的。这意味着我想在同一个处理程序中同时捕获 /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。
最佳答案
我只会注册你的处理程序两次。
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()))
}
关于Gorilla mux 可选查询值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45378566/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!