使用下面的代码,当我访问/test2 时它响应 404 - 未找到。/test1 工作正常。这是为什么?尽管路由器实现了http.Handler 接口(interface),但不允许嵌套吗?
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func main() {
mainRouter := mux.NewRouter()
subRouter := mux.NewRouter()
mainRouter.HandleFunc("/test1", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "test1") })
subRouter.HandleFunc("/test2", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "test2") })
mainRouter.Handle("/", subRouter)
http.ListenAndServe(":9999", mainRouter)
}
编辑:
我的主要目标是添加一些初始工作,这对 subRouter 中的所有路由都是通用的,并且只对它们有用。更具体地说,我想使用 Negroni作为我的中间件编排器。 Negroni 网站上有一个将中间件添加到路由组的示例:
router := mux.NewRouter()
adminRoutes := mux.NewRouter()
// add admin routes here
Create a new negroni for the admin middleware
router.Handle("/admin", negroni.New(
Middleware1,
Middleware2,
negroni.Wrap(adminRoutes),
))
Negroni 基本上执行每个参数的 ServeHTTP 方法,因为它们都实现了 http.Handler。它按顺序执行它们,因此路由器路由将在最后。
我熟悉 Mux 中 Subrouter
的概念,但是据我所知,我不能像上面的例子那样使用它,特别是,我不能在 mainRouter 和它的之间注入(inject)任何东西子路由器
。这就是嵌套看起来更灵活的原因。
最佳答案
我知道这个问题有点老了,但我花了一些时间弄清楚处理程序和匹配在 go 中是如何工作的。可以看我的实验代码here .
基本上,你可以用这样的代码得到你想要的效果:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func main() {
mainRouter := mux.NewRouter()
subRouter := mux.NewRouter()
mainRouter.HandleFunc("/test1", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "test1")
})
subRouter.HandleFunc("/test2", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "test2")
})
// in mux, you need to register subrouter
// with the same path that the handlers in
// it are matching
mainRouter.Handle("/test2", subRouter)
// if your subrouter has handlers that match
// other sub paths - you also need to do this
mainRouter.Handle("/test2/{_dummy:.*}", subRouter)
http.ListenAndServe(":9999", mainRouter)
}
我希望这对某人有帮助。
关于go - 嵌套的 Gorilla Mux 路由器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25107763/