首頁 > 後端開發 > Golang > 如何將 Golang 請求中的上下文傳遞給中間件和處理程序?

如何將 Golang 請求中的上下文傳遞給中間件和處理程序?

Susan Sarandon
發布: 2024-11-17 01:27:03
原創
758 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板