前回の記事「In go、HTTP を検査する方法」 http.ResponseWriter に書き込まれる応答は?」私たちは、単体テスト環境でサーバーの応答を検査する方法を検討しました。ただし、このアプローチはライブ サーバーには適していない可能性があります。
代替ソリューションは、HTTP の変更とログ記録に一般的に使用される手法であるミドルウェア チェーンです。元のリクエスト - レスポンス フローを維持しながら、レスポンスとリクエストを処理します。
negroni のようなライブラリを使用する代わりに、独自の関数ハンドラーを作成できます。コンビネータ:
<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // do something before next(w, r) // do something after } }</code>
コンビネータを使用して複数のハンドラをチェーンできます:
<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
Inこの例では、Sink は何も行わない空のハンドラーです。
ハンドラー コンビネータ アプローチを使用すると、応答をログに記録するハンドラーを作成できます。 :
<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // Replace the response writer with a recorder c := httptest.NewRecorder() next(c, r) // Copy the response from the recorder to the actual writer for k, v := range c.HeaderMap { w.Header()[k] = v } w.WriteHeader(c.Code) c.Body.WriteTo(w) } }</code>
デフォルトのハンドラ コンビネータを作成することで、応答ログ ハンドラをすべての HTTP ルートに適用できます:
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
こうすることで、次のようなチェーンを開始するたびに、
<code class="go">h := NewDefaultHandler(...)</code>
応答ログとその他のデフォルト ハンドラーが自動的に組み込まれます。
以上がミドルウェア チェーンと関数ハンドラー コンビネータを使用して、Go の `http.HandleFunc` に HTTP 応答を記録するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。