首页 >后端开发 >Golang >如何将 Golang 请求中的上下文传递给中间件和处理程序?

如何将 Golang 请求中的上下文传递给中间件和处理程序?

Susan Sarandon
Susan Sarandon原创
2024-11-17 01:27:03762浏览

How to Pass Context in Golang Requests to Middleware and Handlers?

如何将 Golang 请求中的上下文传递给中间件

理解上下文

Go 的上下文,在 1.7 版本中引入,是将元数据与请求相关联的机制。它允许您在代码的不同部分之间传递信息,包括中间件和处理程序。

将上下文传递给中间件

您的问题提出了如何传递中间件和处理程序的上下文。为了与您提供的示例代码保持一致,checkAuth 函数将代表中间件,而 Handler 代表处理程序。

要将上下文传递给中间件,您通常会在请求对象上使用 WithContext 方法。例如:

func checkAuth(authToken string) http.HandlerFunc {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context() // Retrieve the current context from the request

    if r.Header.Get("Auth") != authToken {
      util.SendError(w, "...", http.StatusForbidden, false)
      return
    }

    h := r.Context().Value(key) // Retrieve the handler from context
    h.ServeHTTP(w, r) // Pass the request to the handler
  })
}

将上下文传递给处理程序

要将上下文传递给处理程序,您将再次在请求对象上使用 WithContext 方法。在处理程序的 ServeHTTP 方法中,您可以使用 Value 方法检索上下文:

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  ctx := r.Context() // Retrieve the context from the request
  
  decoder := json.NewDecoder(r.Body)

  // Decode request / context and get params
  var p params
  err := decoder.Decode(&p)
  if err != nil {
    ...
    return
  }

  // Perform GET request and pass context
  ...

}

示例用法

您的 main 函数可能如下所示:

func main() {
  router := mux.NewRouter()

  // Initialize middleware handlers
  h := Handler{
    ...
  }

  // Pass context to authCheck
  authToken, ok := getAuthToken()
  if !ok {
    panic("...")
  }
  authCheck := checkAuth(authToken)

  // Chain middleware handlers and pass context
  router.Handle("/hello", util.UseMiddleware(authCheck, h, ...))
}

请记住,上下文只能用于传递瞬态信息。对于更持久的数据,请使用数据库或其他存储机制。

以上是如何将 Golang 请求中的上下文传递给中间件和处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn