跳到內容

中介軟體

Gin 中的中介軟體提供了一種在 HTTP 請求到達路由處理函式之前進行處理的方式。中介軟體函式與路由處理函式具有相同的簽名——gin.HandlerFunc——通常會呼叫 c.Next() 將控制權傳遞給鏈中的下一個處理函式。

中介軟體的運作方式

Gin 使用洋蔥模型來執行中介軟體。每個中介軟體在兩個階段中執行:

  1. 前置處理c.Next() 之前的程式碼在路由處理函式之前執行。
  2. 後置處理c.Next() 之後的程式碼在路由處理函式返回後執行。

這意味著中介軟體像洋蔥的層一樣包裹著處理函式。第一個附加的中介軟體是最外層。

func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
// Pre-handler phase
c.Next()
// Post-handler phase
latency := time.Since(start)
log.Printf("Request took %v", latency)
}
}

附加中介軟體

在 Gin 中有三種方式附加中介軟體:

// 1. Global -- applies to all routes
router := gin.New()
router.Use(Logger(), Recovery())
// 2. Group -- applies to all routes in the group
v1 := router.Group("/v1")
v1.Use(AuthRequired())
{
v1.GET("/users", listUsers)
}
// 3. Per-route -- applies to a single route
router.GET("/benchmark", BenchmarkMiddleware(), benchHandler)

範圍較廣的中介軟體會先執行。在上面的範例中,對 GET /v1/users 的請求會依序執行 LoggerRecoveryAuthRequired,然後是 listUsers

本節內容