コンテンツにスキップ

ミドルウェア

Ginのミドルウェアは、HTTPリクエストがルートハンドラに到達する前に処理する方法を提供します。ミドルウェア関数はルートハンドラと同じシグネチャ(gin.HandlerFunc)を持ち、通常はc.Next()を呼び出してチェーン内の次のハンドラに制御を渡します。

ミドルウェアの仕組み

Ginはミドルウェアの実行にオニオンモデルを使用します。各ミドルウェアは2つのフェーズで実行されます:

  1. プレハンドラc.Next()の前のコードはルートハンドラの前に実行されます。
  2. ポストハンドラc.Next()の後のコードはルートハンドラが戻った後に実行されます。

これは、ミドルウェアが玉ねぎの層のようにハンドラをラップすることを意味します。最初に登録されたミドルウェアが最も外側の層になります。

func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
// プレハンドラフェーズ
c.Next()
// ポストハンドラフェーズ
latency := time.Since(start)
log.Printf("Request took %v", latency)
}
}

ミドルウェアの登録

Ginでミドルウェアを登録する方法は3つあります:

// 1. グローバル -- すべてのルートに適用
router := gin.New()
router.Use(Logger(), Recovery())
// 2. グループ -- グループ内のすべてのルートに適用
v1 := router.Group("/v1")
v1.Use(AuthRequired())
{
v1.GET("/users", listUsers)
}
// 3. ルートごと -- 単一のルートに適用
router.GET("/benchmark", BenchmarkMiddleware(), benchHandler)

より広いスコープで登録されたミドルウェアが先に実行されます。上記の例では、GET /v1/usersへのリクエストはLoggerRecoveryAuthRequiredlistUsersの順に実行されます。

このセクションの内容