Gin 中間件
Gin 框架允許開發者在處理請求的過程中,加入用戶自己的鈎子(Hook)函數。這個鈎子函 數就叫中間件,中間件適合處理一些公共的業務邏輯,比如登錄認證、權限校驗、數據分頁、 記錄日志、耗時統計等。
通俗的講:中間件就是匹配路由前和匹配路由完成后執行的一系列操作
ctx.Next()調用該請求的剩余處理程序
-
中間件里面加上 ctx.Next()可以讓我們在路由匹配完成后執行一些操作,先完成回調函數后面的程序,在執行c.Next()下面的語句
-
//統計一個請求的執行時間 func initMiddleware(c *gin.Context) { start := time.Now().UnixNano() fmt.Println("1-我是一個中間件") //調用該請求的剩余處理程序 c.Next()//去執行回調函數外的語句 fmt.Println("2-我是一個中間件") end :=time.Now().UnixNano() fmt.Println(end-start) }
一個路由可以配置多個中間件
全局中間件
r := gin.Default()
//全局中間件
r.Use(initMiddlewareOne,initMiddleware)
中間件和對應控制器之間共享數據
設置值:
ctx.Set("username", "張三")
獲取值:
//_ :不接受err
//獲取值
username, _ := c.Get("username")
//get返回的是控接口類型,需要轉換為string類型
v,ok :=username.(string)
if ok == true{
//成功:
c.String(200,"用戶列表:"+v)
}else {
c.String(200,"用戶列表:獲取用戶失敗")
}
gin.Default()
默認使用了 Logger 和 Recovery 中間件,其中: • Logger 中間件將日志寫入 gin.DefaultWriter,即使配置了 GIN_MODE=release。 • Recovery 中間件會 recover 任何 panic。如果有 panic 的話,會寫入 500 響應碼。 如果不想使用上面兩個默認的中間件,可以使用 gin.New()新建一個沒有任何默認中間件的 路由。
gin 中間件中使用 goroutine
當在中間件或 handler 中啟動新的 goroutine 時,不能使用原始的上下文(c *gin.Context), 必須使用其只讀副本(c.Copy())
//定義一個goroutine統計日志
cCp :=ctx.Copy()
go func() {
time.Sleep(5 * time.Second)
fmt.Println("Done! in path " + cCp.Request.URL.Path)
}()