コンテキストを理解する
バージョン 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 サイトの他の関連記事を参照してください。