ホームページ  >  記事  >  バックエンド開発  >  Go HTTP ハンドラーとミドルウェアでコンテキスト情報を渡したり、アクセスしたりするにはどうすればよいですか?

Go HTTP ハンドラーとミドルウェアでコンテキスト情報を渡したり、アクセスしたりするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-16 04:17:03738ブラウズ

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

ミドルウェアと 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。