【问题标题】:Gorilla mux can't separate two routesGorilla mux 不能分开两条路线
【发布时间】: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


【解决方案1】:

@Hymns For Disco 注意到要解决这个问题,我们必须使用正则表达式在弯括号内检查路径变量,因此正确的路由表应该如下所示^

    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:[0-9]+}/", webApiContext.GetFunctionById).Methods("GET")
    router.HandleFunc(baseUri + "/function/{id:[0-9]+}/body/", webApiContext.GetFunctionBodyById).Methods("GET")
    router.HandleFunc(baseUri + "/function/", webApiContext.CreateFunction).Methods("POST")
    router.HandleFunc(baseUri + "/function/{id:[0-9]+}/", webApiContext.UpdateFunction).Methods("PUT")
    router.HandleFunc(baseUri + "/function/{id:[0-9]+}/", webApiContext.DeleteFunction).Methods("DELETE")

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 2021-06-05
    • 2014-09-08
    • 2016-04-07
    • 2016-04-26
    • 1970-01-01
    • 2015-04-05
    • 2015-04-18
    相关资源
    最近更新 更多