ホームページ  >  記事  >  バックエンド開発  >  ミドルウェア チェーンと関数ハンドラー コンビネータを使用して、Go の `http.HandleFunc` に HTTP 応答を記録するにはどうすればよいでしょうか?

ミドルウェア チェーンと関数ハンドラー コンビネータを使用して、Go の `http.HandleFunc` に HTTP 応答を記録するにはどうすればよいでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 04:41:30783ブラウズ

How can you log HTTP responses in Go's `http.HandleFunc` using middleware chaining and functional handler combinators?

http.HandleFunc の受信 HTTP リクエストへの応答をログに記録する

前回の記事「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 サイトの他の関連記事を参照してください。

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