在Gorilla Mux中嵌套子路由器

时间:2015-04-11 08:53:48

标签: go routing mux gorilla

我一直在使用gorilla/mux来满足我的路由需求。但是我注意到一个问题,当我嵌套多个Subrouters时,它不起作用。

以下是示例:

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)

然而,这似乎不起作用。仅当我在链中使用单个Subrouter时它才有效。

有什么想法吗?

3 个答案:

答案 0 :(得分:16)

我明白了,所以我会在这里发布,以防有​​人像我一样愚蠢。 :d

创建基于路径的子路由器时,您必须使用PathPrefix而不是Path来获取它。

r.PathPrefix("/api").Subrouter()

仅在将处理程序附加到该端点时使用r.Path("/api")

答案 1 :(得分:0)

如果您需要分离出UI和API路由器,则可以按照OP的建议进行操作:

appRouter := r.PathPrefix("/").Subrouter()
appRouter.Use(myAppRouter)
apiRouter := r.PathPrefix("/api").Subrouter()
apiRouter.Use(myAPIRouter)

非常感谢OP提供的答案。希望在我的用例中将所有内容都放在一个地方会有所帮助。

答案 2 :(得分:0)

对于那些在 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应用中间件