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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HTTPミドルウェアチェーンの基本
- ロギングとリクエストIDのミドルウェア
- 認証とレート制限のミドルウェア
- CORSとパニックリカバリーのミドルウェア