go - 嵌套的 Gorilla Mux 路由器不工作

标签 go mux gorilla

使用下面的代码,当我访问/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/

相关文章:

compiler-errors - VHDL错误:Pack:2811 - Directed packing was unable to obey the user design

google-app-engine - Mux 和 http.HandleFunc 都适用于 Google App Engine 上的 helloworld 端点

json - 根据 key 解码 JSON

go - 如何解析表单后的数组

go - 是否可以进行configure-make-make安装?

Golang gorilla mux 未找到处理程序无法正常工作

go - 是否可以从 websocket 连接访问 HTTP 请求?

go - negroni/gorilla mux 的子路由器问题

Gorilla websocket 如何将二进制数据解码为 JSON?

testing - 如何使用相对目录测试 Go 程序?