在Gorilla / Mux中反转子路由器

时间:2015-01-24 02:25:38

标签: go gorilla

我想获取命名子路由的路径,但下面的代码不起作用。当我尝试在非子路由上使用相同的逻辑时,它工作正常。如何获取命名子路径的路径?

router = mux.NewRouter() // this is a global variable
home := router.Path("/home").Subrouter()
home.Methods("GET").HandlerFunc(c.GetHomeHandler).Name("home")
home.Methods("POST").HandlerFunc(c.PostHomeHandler)

p, err := router.Get("home").URL()
if (err != nil) { panic (err) }
log.Printf(p.Path)

上面给出了这个错误:

panic: mux: route doesn't have a host or path

现在如果我做router.HandleFunc("/home", c.GetHomeHandler).Name("home"),它就可以了。

感谢您的帮助。

更新

这是一个合理的解决方法,但它避免了创建子路由。这对我上面的例子很好,但可能并不理想,因为你不会得到Subroute的所有好处。

router.Path("/home").Methods("GET").HandlerFunc(c.GetHomeHandler).Name("home")
router.Path("/home").Methods("POST").HandlerFunc(c.PostHomeHandler)

谢谢!

1 个答案:

答案 0 :(得分:3)

我相信您需要使用PathPrefix指定您的子路由,然后为了支持/ home和/ home / enable StrictSlash(due to this issue

router := mux.NewRouter() 
home := router.PathPrefix("/home").Subrouter().StrictSlash(true)
home.Path("/").Methods("GET").HandlerFunc(GetHomeHandler).Name("home")
home.Path("/post/").Methods("POST").HandlerFunc(PostHomeHandler).Name("home-post")


p, err := router.Get("home").URL()
if (err != nil) { panic (err) }
log.Printf(p.Path)

p, err = home.Get("home-post").URL()
if (err != nil) { panic (err) }
log.Printf(p.Path)