猿问

如何将 HttpRouter 与 MuxChain 一起使用?

我想将httprouter与muxchain一起使用,同时保留/: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 需要查看 typehttprouter.Handle但该函数是使用 type 调用的http.Handler。


有什么办法可以同时使用这两个包吗?HttpRouter GitHub 存储库说


唯一的缺点是,当使用 http.Handler 或 http.HandlerFunc 时,无法检索任何参数值,因为没有有效的方法来传递带有现有函数参数的值。


千巷猫影
浏览 209回答 2
2回答

汪汪一只猫

您必须修补 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")            }        }    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答