我想将httproutermuxchain结合使用,同时保留诸如/:user/之类的路由参数。

请看以下示例:

func log(res http.ResponseWriter, req *http.Request) {
  fmt.Println("some logger")
}

func index(res http.ResponseWriter, req *http.Request) {
  fmt.Fprintf(res, "Hi there, I love %s!", req.URL.Path[1:])
}

func main() {
  logHandler := http.HandlerFunc(log)
  indexHandler := http.HandlerFunc(index)
  chain := muxchain.ChainHandlers(logHandler, indexHandler)
  router := httprouter.New()
  router.Handler("GET", "/:user", chain)
  http.ListenAndServe(":8080", router)
}

当我访问http://localhost:8080/john时,我显然无法访问ps httprouter.Params这是因为httprouter需要查看httprouter.Handle类型,但是该函数使用http.Handler类型调用。

有什么办法可以同时使用两个软件包? HttpRouter GitHub repo 说

最佳答案

您必须打补丁muxchain才能接受httprouter.Handle,但是创建自己的链处理程序非常简单,例如:

func chain(funcs ...interface{}) httprouter.Handle {
    return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
        for _, h := range funcs {
            switch h := h.(type) {
            case httprouter.Handle:
                h(w, r, p)
            case http.Handler:
                h.ServeHTTP(w, r)
            case func(http.ResponseWriter, *http.Request):
                h(w, r)
            default:
                panic("wth")
            }

        }
    }
}

关于go - 如何在MuxChain中使用HttpRouter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25887840/

10-09 15:19