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

Susan Sarandon
リリース: 2024-11-17 01:27:03
オリジナル
687 人が閲覧しました

How to Pass Context in Golang Requests to Middleware and Handlers?

Golang リクエストのコンテキストをミドルウェアに渡す方法

コンテキストを理解する

バージョン 1.7 で導入された Go のコンテキストは次のとおりです。メタデータをリクエストに関連付けるメカニズム。これにより、ミドルウェアやハンドラーなど、コードの異なる部分間で情報を受け渡すことができます。

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

あなたの質問では、コンテキストを渡す方法の問題が生じます。ミドルウェアとハ​​ンドラーの両方にコンテキストを追加します。提供したコード例と一致させるために、checkAuth 関数はミドルウェアを表し、Handler はハンドラーを表します。

ミドルウェアにコンテキストを渡すには、通常、リクエスト オブジェクトで WithContext メソッドを使用します。例:

func checkAuth(authToken string) http.HandlerFunc {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context() // Retrieve the current context from the request

    if r.Header.Get("Auth") != authToken {
      util.SendError(w, "...", http.StatusForbidden, false)
      return
    }

    h := r.Context().Value(key) // Retrieve the handler from context
    h.ServeHTTP(w, r) // Pass the request to the handler
  })
}
ログイン後にコピー

ハンドラーにコンテキストを渡す

コンテキストをハンドラーに渡すには、リクエスト オブジェクトで WithContext メソッドを再度使用します。ハンドラーの ServeHTTP メソッドでは、Value メソッドを使用してコンテキストを取得できます。

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  ctx := r.Context() // Retrieve the context from the request
  
  decoder := json.NewDecoder(r.Body)

  // Decode request / context and get params
  var p params
  err := decoder.Decode(&p)
  if err != nil {
    ...
    return
  }

  // Perform GET request and pass context
  ...

}
ログイン後にコピー

使用例

main 関数は次のようになります。

func main() {
  router := mux.NewRouter()

  // Initialize middleware handlers
  h := Handler{
    ...
  }

  // Pass context to authCheck
  authToken, ok := getAuthToken()
  if !ok {
    panic("...")
  }
  authCheck := checkAuth(authToken)

  // Chain middleware handlers and pass context
  router.Handle("/hello", util.UseMiddleware(authCheck, h, ...))
}
ログイン後にコピー

コンテキストは一時的な情報を渡すためにのみ使用する必要があることに注意してください。より永続的なデータについては、データベースまたはその他のストレージ メカニズムを使用してください。

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

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