ミドルウェアと HandlerFunc でのコンテキストの受け渡し
Go では、コンテキスト パッケージはリクエスト ハンドラー間で情報を渡すための機能を提供します。これは、ハンドラー関数の実行の前後にアクションを実行できるミドルウェアで特に役立ちます。
コンテキストの作成と受け渡し
ミドルウェアのコンテキストでは、次のようにします。リクエストのコンテキストで 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 を呼び出すときに使用されます。 method.
ハンドラーでのコンテキストへのアクセス
ハンドラーは、現在のコンテキストを返す r.Context() を呼び出すことでコンテキスト情報にアクセスできます。以下のコード スニペットに示すように、値は Value メソッドを使用して取得できます。
func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { authToken := r.Context().Value("auth_token").(string) // ... }
以上がGo HTTP ハンドラーとミドルウェアでコンテキスト情報を渡したり、アクセスしたりするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。