0Pricing
Go Academy · レッスン

HTTPミドルウェアチェーンの基本

http.Handlerをラップし、nextで連結します。

「HTTPミドルウェアチェーンの基本」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

net/httpのミドルウェア

Goの標準ライブラリでは、ミドルウェアはhttp.Handlerを受け取り、元のハンドラーを追加の動作で包んだ新しいhttp.Handlerを返す関数です。

type Middleware func(http.Handler) http.Handler

基本的なミドルウェア

内側のHandlerFuncで元のハンドラーを包み、前処理と後処理を追加します。

func Logger(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("→ %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
        log.Printf("← %s %s done", r.Method, r.URL.Path)
    })
}

ミドルウェアの適用

muxに登録する前に、ハンドラーをミドルウェアで包みます。

mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)

ミドルウェアチェーンヘルパー

チェーン関数を使用すると、複数のミドルウェアを左から右へ読みやすい順序で適用できます。

func Chain(h http.Handler, ms ...func(http.Handler) http.Handler) http.Handler {
    for i := len(ms)-1; i >= 0; i-- { h = ms[i](h) }
    return h
}
// Usage: Chain(handler, Logger, Auth, RateLimit)

ミドルウェア内のコンテキスト

派生コンテキストを作成してリクエストをラップすることで、リクエスト単位の値を付加します。

func RequestID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := uuid.New().String()
        ctx := context.WithValue(r.Context(), reqIDKey, id)
        w.Header().Set("X-Request-ID", id)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

レスポンスライターのラッパー

ResponseWriterをラップして、ハンドラーが書き込んだステータスコードを取得します。

type captureWriter struct {
    http.ResponseWriter
    status int
}
func (cw *captureWriter) WriteHeader(code int) {
    cw.status = code
    cw.ResponseWriter.WriteHeader(code)
}

パニックリカバリーミドルウェア

パニックから復旧し、サーバーのクラッシュを防ぎます。

func Recovery(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if rec := recover(); rec != nil {
                http.Error(w, "Internal Server Error", 500)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

順序が重要

ミドルウェアは、ハンドラーをラップした順序で実行されます。Recoveryは最外部に配置します(すべてをラップします)。Authはビジネスロジックより前に配置します。Loggingは通常、Recoveryの後で最外部に配置します。

サードパーティ製ルーターとの互換性

ミドルウェアは標準のfunc(http.Handler) http.Handlerシグネチャに従うため、chi、gorilla/mux、およびhttp.Handlerを受け取る任意のルーターと互換性があります。

グローバルとルート固有の適用

ミドルウェアはmux全体にグローバルに適用することも、個別のハンドラーをラップして特定のルートにだけ適用することもできます。chiのサブルーターを使うと、グループ単位のミドルウェアをより簡潔に構成できます。

ミドルウェアのテスト

httptest.NewRecorderとhttptest.NewRequestを使用すると、実際のサーバーを起動せずにミドルウェアを単体でテストできます。

w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)

クイックチェック

net/httpの標準的なミドルウェアのシグネチャは何でしょうか。

まとめ:ミドルウェアチェーン

重要なポイント:

  • func(http.Handler) http.Handlerが標準的なシグネチャです
  • 深いネストを避けるにはChainヘルパーを使用します
  • 値を付加するにはr.WithContext(ctx)を使用し、ステータスを記録するにはライターをラップします
  • Recoveryは最外部、Authはビジネスロジックより前、LoggingはRecoveryの後に配置します

よくある質問

「HTTPミドルウェアチェーンの基本」レッスンは無料ですか?

はい。「HTTPミドルウェアチェーンの基本」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「HTTPミドルウェアチェーンの基本」で何を学びますか?

http.Handlerをラップし、nextで連結します。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「HTTPミドルウェアチェーンの基本」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HTTPミドルウェアチェーンの基本
  2. ロギングとリクエストIDのミドルウェア
  3. 認証とレート制限のミドルウェア
  4. CORSとパニックリカバリーのミドルウェア
← Go Academyに戻る