> 在Gin框架中,中間件(Middleware)指的是可以攔截**http請求-響應**生命周期的特殊函數,在請求-響應生命周期中可以注冊多個中間件,每個中間件執行不同的功能,一個中間執行完再輪到下一個中間件執行
> 中間件的常見應用場景如下:
> * 請求限速
> * api接口簽名處理
> * 權限校驗
> * 統一錯誤處理
> Gin支持設置全局中間件和針對路由分組設置中間件,設置全局中間件意思就是會攔截所有請求,針對分組路由設置中間件,意思就是僅對這個分組下的路由起作用。
[TOC]
## 使用中間件
~~~
func main() {
r := gin.Default()
// 通過use設置全局中間件
// 設置日志中間件,主要用于打印請求日志
r.Use(gin.Logger())
// 設置Recovery中間件,主要用于攔截paic錯誤,不至于導致進程崩掉
r.Use(gin.Recovery())
// 忽略后面代碼
}
~~~
## 自定義中間件
> 下面通過一個例子,了解如果自定義一個中間件
~~~
package main
// 導入gin包
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
// 自定義個日志中間件
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
// 可以通過上下文對象,設置一些依附在上下文對象里面的鍵/值數據
c.Set("example", "12345")
// 在這里處理請求到達控制器函數之前的邏輯
// 調用下一個中間件,或者控制器處理函數,具體得看注冊了多少個中間件。
c.Next()
// 在這里可以處理請求返回給用戶之前的邏輯
latency := time.Since(t)
log.Print("it cost ", latency)
// 例如,查詢請求狀態嗎
status := c.Writer.Status()
log.Println("the status is ", status)
}
}
func main() {
r := gin.Default()
// 注冊上面自定義的日志中間件
r.Use(Logger())
r.GET("/test", func(c *gin.Context) {
// 查詢我們之前在日志中間件,注入的鍵值數據
example := c.MustGet("example").(string)
// it would print: "12345"
log.Println("the value is " + example)
})
// Listen and serve on 0.0.0.0:8080
r.Run(":8080")
}
~~~
- 基礎知識
- 開發環境
- 包名規則
- 包初始化 (init)
- 基礎數據類型
- 基礎類型轉換
- 格式化輸出
- go指針
- 流程控制語句
- 函數定義
- 匿名函數
- 數組和切片
- map集合
- 結構體
- Interface接口
- 日期處理
- 數學計算
- 正則表達式
- 協程 (并發處理)
- channel
- waitgroup
- mutex (鎖機制)
- websocket
- protobuf
- Redis
- 錯誤處理
- 打包程序
- NSQ消息隊列
- 單元測試
- beego
- 安裝入門
- Gin
- 快速入門
- 路由與控制器
- 處理請求參數
- 表單驗證
- 處理響應結果
- 渲染HTML模版
- 訪問靜態文件
- Gin中間件
- Cookie處理
- Session處理
- Gin上傳文件
- swagger
- pprof性能測試
- GORM
- 入門教程
- 模型定義
- 數據庫連接
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務處理
- 關聯查詢
- 屬于 (BELONG TO)
- 一對一 (Has One)
- 一對多 (Has Many)
- 多對多 (Many to Many)
- 預加載 (Preloading)
- 錯誤處理
- 第三方常用插件
- viper 讀取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷鍵