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