ホームページ >バックエンド開発 >Golang >Go のミドルウェアとハ​​ンドラーでコンテキストを適切に渡すにはどうすればよいですか?

Go のミドルウェアとハ​​ンドラーでコンテキストを適切に渡すにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 06:52:02746ブラウズ

How to Properly Pass Context in Middleware and Handlers in Go?

Go でミドルウェアとハ​​ンドラーにコンテキストを渡す

はじめに

Go でコンテキストを理解することは、混乱を招く可能性があります。コンテキストをミドルウェアとハ​​ンドラーに効果的に渡す方法を見てみましょう。

ミドルウェアでコンテキストを渡す

ミドルウェアにコンテキストを渡すには、次の手順に従います。

  1. 新しいcontext.WithTimeout() または context.WithValue().
  2. Call を使用して、リクエスト コンテキストからコンテキストを取得します。新しいコンテキストを含む更新されたリクエストを含む ServeHTTP を実行します。
  3. 認可チェッカーでは、ServeHTTP を呼び出す前にコンテキストにユーザーの情報を追加します。

たとえば、リクエストのタイムアウト:

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)

ハンドラーでのコンテキストの受け渡し

へコンテキストをハンドラーに渡します:

  1. リクエストのコンテキストに値を追加するには context.WithValue() を使用します。
  2. ハンドラーで、 request.Context().Value() を使用してアクセスします。

たとえば、ユーザー ID をcontext:

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))

コード例

コンテキストを使用したミドルウェアとハ​​ンドラーの実装例を次に示します:

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
            }
            // Add authentication-specific context here
            h.ServeHTTP(w, r)
        })
    }
}

type Handler struct {
    ...
    ...
}

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // Get context values here
    decoder := json.NewDecoder(r.Body)

    // ...
}

func main() {
    router := mux.NewRouter()
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    authCheck := checkAuth(authToken)
    h := Handler{
       ...
   } 
   router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}

以上がGo のミドルウェアとハ​​ンドラーでコンテキストを適切に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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