【发布时间】:2021-05-03 11:49:13
【问题描述】:
我正在使用 Gorilla,但我发现 gorilla 路由器无法解析两条路由。我在每个 URL 的末尾使用斜杠。考虑以下路由表:
router := mux.NewRouter()
baseUri, _ := stringFormatter.Format("/api/{0}", apiVersion)
// function resource
router.HandleFunc(baseUri + "/function/", webApiContext.GetAllFunctions).Methods("GET")
router.HandleFunc(baseUri + "/function/find/", webApiContext.FindFunctions).Methods("GET").Queries("query", "{query}")
router.HandleFunc(baseUri + "/function/{id}/", webApiContext.GetFunctionById).Methods("GET")
router.HandleFunc(baseUri + "/function/{id}/body/", webApiContext.GetFunctionBodyById).Methods("GET")
router.HandleFunc(baseUri + "/function/", webApiContext.CreateFunction).Methods("POST")
router.HandleFunc(baseUri + "/function/{id}/", webApiContext.UpdateFunction).Methods("PUT")
router.HandleFunc(baseUri + "/function/{id}/", webApiContext.DeleteFunction).Methods("DELETE")
Gorilla 无法将这两条路由 GET /function/{id}/ 和 GET /function/find/?query={query} 分开。如果我要放置 find 方法 above 按 id 获取函数,查找处理程序 调用 find 和 get 函数按 ID 网址。
这可以通过从这些 URL 之一中删除尾部斜杠来解决,即查找 URL 声明。但我 必须使用 StrictSlash(true) 函数,这使得 无法使用带有 URL 声明的黑客攻击。
能否请您帮助解决正确的 URL 声明问题。
【问题讨论】:
-
你
ids是什么格式?您确定find不是有效的潜在id?如果是这样,您可以使用正则表达式来验证id以便“查找”不再通过。 -
id 是整数。但是,我从字符串中获取路径变量,也许如果我能以某种方式影响 HandleFunc 解析过程,我可以解决我的问题。但是,您建议在哪里使用正则表达式,请给我举个例子。
-
您可以在 mux 存储库的自述文件中看到一些示例:github.com/gorilla/mux like
{id:[0-9]+}to match a decimal number id -
@HymnsForDisco,是的,我会在星期一试试,看来这可以解决我的问题。谢谢你!
-
@HymnsForDisco,谢谢你,你的建议帮助我解决了这个问题
标签: go url-routing gorilla