? ? ? ? 感覺中間件是gin中挺重要的內容,就拿出來單獨講講吧!
什么是中間件?
Gin框架允許開發者在處理請求的過程中,加入用戶自己的 HandlerFunc 函數。
它適合處理一些公共的業務邏輯,比如登錄認證、權限校驗、數據分頁、記錄日志、耗時統計等。
也就是我們這里說的中間件。
必須是一個gin.HandlerFunc
類型,即func(* Context)類型。
// HandlerFunc defines the handler used by gin middleware as return value. type HandlerFunc func(*Context)
自定義中間件
定義中間件:
func myHandler() gin.HandlerFunc {return func(c *gin.Context) {startTime := time.Now()c.Next()endTime := time.Now()duration := endTime.Sub(startTime)fmt.Println(duration)}
}
中間件的使用:
注冊全局路由,所有的請求都會經過這里來處理,打印出訪問時間。
router.Use(myHandler())
為某個路由單獨注冊中間件
router.GET("/example", myHandler(), func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{})})
為路由組注冊中間件
func Group(router *gin.Engine) {userGroup := router.Group("/user")userGroup.Use(MyHandler()){ //習慣性一對`{}`包裹同組的路由,這只是為了看著清晰,你用不用`{}`包裹功能上沒什么區別userGroup.GET("/1", func(c *gin.Context) {}) // /user/1userGroup.GET("/2", func(c *gin.Context) {}) // /user/2userGroup.GET("/3", func(c *gin.Context) {}) // /user/3}
}
中間件的使用順序
在 Gin 中,中間件是按照注冊的順序依次執行的。如果中間件 A 注冊在 B 之前,那么 A 會在 B 之前執行;調用c.next() 后,將執行下一個中間件,如果 c.Abort()?被調用,后續中間件將不會執行。
gin默認中間鍵
gin.Default()
默認使用了Logger
和Recovery
中間件,其中:
-
Logger
中間件將日志寫入gin.DefaultWriter
,即使配置了GIN_MODE=release
。 -
Recovery
中間件會recover任何panic
。如果有panic的話,會寫入500響應碼。
如果不想使用上面兩個默認的中間件,可以使用gin.New()
新建一個沒有任何默認中間件的路由。
?
? ? ? ? 本來想著挺重要的,就單獨寫了,學了一遍之后發現很簡單,可能是因為我之前學過吧,之前那遍挺蒙的,就覺得難了,回頭再看其實不難。?這篇文章比我寫的好寫的全,十分推薦:【Golang】——Gin 框架中間件詳解:從基礎到實戰_gin 中間件-CSDN博客