在 Gorilla Mux 中嵌套子路由器
Nesting subrouters in Gorilla Mux
我一直在使用 gorilla/mux
来满足我的路由需求。但是我注意到一个问题,当我嵌套多个子路由器时它不起作用。
示例如下:
func main() {
r := mux.NewRouter().StrictSlash(true)
api := r.Path("/api").Subrouter()
u := api.Path("/user").Subrouter()
u.Methods("GET").HandleFunc(UserHandler)
http.ListenAndServe(":8080", r)
}
我想使用这种方法,这样我就可以将路由器填充委托给其他包,例如 user.Populate(api)
但这似乎不起作用。仅当我在链中使用单个子路由器时它才有效。
有什么想法吗?
我想出来了,所以我就 post 在这里,以防有人像我一样愚蠢。 :D
创建基于路径的子路由器时,必须使用PathPrefix
而不是Path
获取它。
r.PathPrefix("/api").Subrouter()
仅在将处理程序附加到该端点时使用 r.Path("/api")
。
如果您需要分离 UI 和 API 路由器,您可以简单地按照 OP 的建议进行操作:
appRouter := r.PathPrefix("/").Subrouter()
appRouter.Use(myAppRouter)
apiRouter := r.PathPrefix("/api").Subrouter()
apiRouter.Use(myAPIRouter)
非常感谢 OP 提供的答案。希望在我的用例中将所有内容集中在一个地方会对某人有所帮助。
对于那些正在努力在 auth 和 noauth 路由之间进行拆分的人来说,以下方法对我来说很好用:
r := mux.NewRouter()
noAuthRouter := r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
return r.Header.Get("Authorization") == ""
}).Subrouter()
authRouter := r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
return true
}).Subrouter()
那么你可以只为authRouter申请中间件
我一直在使用 gorilla/mux
来满足我的路由需求。但是我注意到一个问题,当我嵌套多个子路由器时它不起作用。
示例如下:
func main() {
r := mux.NewRouter().StrictSlash(true)
api := r.Path("/api").Subrouter()
u := api.Path("/user").Subrouter()
u.Methods("GET").HandleFunc(UserHandler)
http.ListenAndServe(":8080", r)
}
我想使用这种方法,这样我就可以将路由器填充委托给其他包,例如 user.Populate(api)
但这似乎不起作用。仅当我在链中使用单个子路由器时它才有效。
有什么想法吗?
我想出来了,所以我就 post 在这里,以防有人像我一样愚蠢。 :D
创建基于路径的子路由器时,必须使用PathPrefix
而不是Path
获取它。
r.PathPrefix("/api").Subrouter()
仅在将处理程序附加到该端点时使用 r.Path("/api")
。
如果您需要分离 UI 和 API 路由器,您可以简单地按照 OP 的建议进行操作:
appRouter := r.PathPrefix("/").Subrouter()
appRouter.Use(myAppRouter)
apiRouter := r.PathPrefix("/api").Subrouter()
apiRouter.Use(myAPIRouter)
非常感谢 OP 提供的答案。希望在我的用例中将所有内容集中在一个地方会对某人有所帮助。
对于那些正在努力在 auth 和 noauth 路由之间进行拆分的人来说,以下方法对我来说很好用:
r := mux.NewRouter()
noAuthRouter := r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
return r.Header.Get("Authorization") == ""
}).Subrouter()
authRouter := r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
return true
}).Subrouter()
那么你可以只为authRouter申请中间件