首頁 > 後端開發 > Golang > 如何在 Go HTTP 處理程序和中間件中傳遞和存取上下文資訊?

如何在 Go HTTP 處理程序和中間件中傳遞和存取上下文資訊?

Susan Sarandon
發布: 2024-11-16 04:17:03
原創
844 人瀏覽過

How can I pass and access context information in Go HTTP Handlers and Middleware?

在中間件和HandlerFunc 中傳遞上下文

在Go 中, context 套件提供了在請求處理程序之間傳遞訊息的功能。這對於中間件特別有用,中間件可以在執行處理程序函數之前和之後執行操作。

建立和傳遞上下文

在中間件的上下文中,我們可以透過在請求的上下文上呼叫context.WithValue 來建立新的上下文,並提供鍵和值對。然後,在呼叫處理程序的 ServeHTTP 方法時應使用這個新上下文。

例如,在提供的程式碼片段中,checkAuth 中介軟體接收請求上下文和驗證令牌作為輸入。它會傳回一個包裝的處理函數,用於檢查身份驗證令牌。

func checkAuth(authToken string) util.Middleware {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            if r.Header.Get("Auth") != authToken {
                util.SendError(w, "...", http.StatusForbidden, false)
                return
            }
            h.ServeHTTP(w, r)
        })
    }
}
登入後複製

要使用身份驗證令牌初始化上下文,我們可以在請求的上下文上呼叫context.WithValue,如下所示:

func main() {
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    ctx := context.WithValue(r.Context(), "auth_token", authToken)
    router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}
登入後複製

當中間件處理程序呼叫原始處理程序的ServeHTTP 方法時,將使用這個新上下文。

訪問處理程序中的上下文

處理程序可以訪問該上下文通過調用 r.Context() 來獲取信息,該方法返回當前上下文。可以使用 Value 方法檢索該值,如下面的程式碼片段所示:

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    authToken := r.Context().Value("auth_token").(string)
    // ...
}
登入後複製

以上是如何在 Go HTTP 處理程序和中間件中傳遞和存取上下文資訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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