go - 从 Slice 嵌套函数

标签 go slice middleware

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

相关文章:

go - 我想将一个文件拆分为大小相同的 "chunks"或 slice 并使用 goroutines 同时处理它们

scala - Go 与 Scala 的实时网络应用

go - 在 Go 中,如何复制 slice 的最后一个元素?

node.js - 从请求中获取用户浏览器数据

c# - 错误处理中间件捕获永远不会被捕获

build - 在 travis-ci -golang 上找不到包

go - 如何导入项目特定的 go 包,同时为完全不同的项目通用的 go 包维护一个单独的位置?

python - Numpy 3D数组数据沿指定轴切片

vector - Itertools 和带有切片索引的函数之间的 Rust 向量类型转换/接口(interface)问题

node.js - 阻止函数被多次调用