大猩猩复用器不能分开两条路线

Gorilla mux can't separate two routes

我正在使用 Gorilla,我发现 gorilla 路由器无法解析两条路由。我在每个 URL 的末尾使用斜杠。考虑以下路由 table:

    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} 这两条路由分开。如果我在查找方法 上面 通过id获取函数,查找处理程序 通过 id URLs.

调用查找和获取函数

这可以通过 其中一个 URL 中删除尾部斜杠来解决,即查找 URL 宣言。但是我 必须使用 StrictSlash(true) 函数,这使得 无法使用那个 hack 声明 URL。

能否请您通过正确的 URL 声明帮助解决问题。

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

    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")