在使用julienschmidt/httprouter时链接中间件的最佳方式是什么?如何在goLang中使用julienschmidt/httprouter时使用中间件?
据我所搜索到的,http.HandlerFunc只接受函数func (w ResponseWriter, r *Request)
的形式,而httprouter.Handle函数的形式是func (w http.ResponseWriter, r *http.Request, ps httprouter.Params)
。
如何在不将httprouter.Handle函数转换为http.HandlerFunc的情况下链接中间件?
例如:
我routes.go是形式的,
router := httprouter.New()
router.POST("/api/user/create", middlewares.EscapeStringsMiddleware(User.CreateUser))
log.Fatal(http.ListenAndServe(":8000", router))
我怎样写中间件功能为上述路线?
已经尝试过的方法:获得
1.
func EscapeStringsMiddleware(next http.Handler) httprouter.Handle {
return func (response http.ResponseWriter, request *http.Request, ps httprouter.Params) {
err := request.ParseForm()
if err != nil {
panic(err)
}
for key, values := range request.Form {
for i, value := range values {
value = template.HTMLEscapeString(value)
value = template.JSEscapeString(value)
request.Form[key][i] = value
}
}
next.ServeHTTP(response, request)
}
}
错误:
cannot use User.CreateUser (type func(http.ResponseWriter, *http.Request, httprouter.Params)) as type http.Handler in argument to middlewares.EscapeStringsMiddleware:
func(http.ResponseWriter, *http.Request, httprouter.Params) does not implement http.Handler (missing ServeHTTP method)
2.
func EscapeStringsMiddleware(next httprouter.Handle) httprouter.Handle {
return func (response http.ResponseWriter, request *http.Request, ps httprouter.Params) {
err := request.ParseForm()
if err != nil {
panic(err)
}
for key, values := range request.Form {
for i, value := range values {
value = template.HTMLEscapeString(value)
value = template.JSEscapeString(value)
request.Form[key][i] = value
}
}
next.ServeHTTP(response, request)
}
}
错误获得:
next.ServeHTTP undefined (type httprouter.Handle has no field or method ServeHTTP)
而且我怎么串联多个中间件?
例如,
router.POST("/api/user/create", middlewares.VerifyCSRF(middlewares.EscapeStringsMiddleware(User.CreateUser)))
User.CreateUser的类型是httprouter.Handle即'FUNC(w的http.ResponseWriter,R * http.Request,PS httprouter.Params)'。我也会考虑传递参数给这个函数。另外,如果我链接多个中间件,那么这个代码在父中间件中如何变化? 即 ''' –
@RohithBalaji发布了一个带有错误的完整可运行示例,那么我可以说更多的路由器(更好的方法是使用路由器) –
@RohithBalaji我更新了我的答案 –