大猩猩复用器不能分开两条路线
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")
我正在使用 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")