我想将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需要查看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/