ホームページ > バックエンド開発 > 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.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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート