golang handler middleware

我们知道 handler 可以这么写:

func messageHandler(message string) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte(message)
  })
}

我们可以通过传递一个 next handler 代替 message 来创建一个 handler 链,来实现 middleware 的功能。

func exampleMiddleware(next http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    // Our middleware logic goes here...
    next.ServeHTTP(w, r)
  })
}

middleware 有这样的签名func(http.Handler) http.Handler

因为它返回 http.Handler,所以可以直接用在 http.Handle函数里。

http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))

reference