gpt4 book ai didi

go - 从 Slice 嵌套函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:55 24 4
gpt4 key购买 nike

我正在构建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com