我正在构建一个 Go 网络应用程序,它在处理路由时支持各种中间件功能。我尽可能地坚持使用 net/http
,并且想知道如何在不使用像 negroni 这样的中间件库的情况下实现这一目标。
基本上我想做的是能够提供一部分中间件功能,比如一个用于日志记录,一个用于检查有效的 JWT,最后是处理请求的处理程序。
我可以很简单地通过定义以下结构来使用 negroni 做到这一点:
// Route ..
type Route struct {
Method string
Path string
Middleware []negroni.Handler
Handler http.HandlerFunc
}
然后像这样定义一个路由:
var commonRoutes = []Route{
{
Method: "GET",
Path: "/info",
Middleware: []negroni.Handler{negroni.HandlerFunc(middleware.CheckCache), negroni.HandlerFunc(middleware.Authenticated), negroni.NewLogger()},
Handler: handlers.APIInfo,
},
}
最后,当我启动我的服务器时,我导入路由列表并像这样注册它们:
for _, r := range routes {
handler := append(r.Middleware, negroni.Wrap(r.Handler))
router.Handle(r.Path, negroni.New(handler...)).Methods(r.Method)
}
这非常有效。
知道我如何仅使用标准的 net/http
签名和定义中间件处理程序的方式来做到这一点,如下所示:
http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))
谢谢你:)
最佳答案
func Auth(n http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("Start")
n.ServeHTTP(w, r)
log.Printf("End")
})
}
func processReq(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Success"))
}
func main() {
handler := http.HandlerFunc(processReq)
http.Handle("/",Auth(handler))
http.ListenAndServe(":8000", nil)
}
可以使用 http.handler 完成
关于go - 从 Slice 嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46292705/