1、什么是中间件
在Gin框架中,中间件(Middleware)指的是可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间件执行完再轮到下一个中间件。
2、中间件的作用
- 请求到达http请求处理方法之前,拦截请求
-
- 认证
- 权限校验
- 限流
- 数据过滤
- ip白名单
- 处理完请求后,拦截响应,并进行相应的处理
-
- 统一添加响应头
- 数据过滤
3、Gin中默认中间件
3.1、默认中间件
Gin中默认使用了Logger(), Recovery()全局作用的两个中间件
r:=gin.Default()
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
Gin中默认自带这些中间件:
- gin自带默认有这些中间件
func BasicAuth(accounts Accounts) HandlerFunc
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc
func Bind(val interface{}) HandlerFunc //拦截请求参数并进行绑定
func ErrorLogger() HandlerFunc //错误日志处理
func ErrorLoggerT(typ ErrorType) HandlerFunc //自定义类型的错误日志处理
func Logger() HandlerFunc //日志记录
func LoggerWithConfig(conf LoggerConfig) HandlerFunc
func LoggerWithFormatter(f LogFormatter) HandlerFunc
func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc
func Recovery() HandlerFunc
func RecoveryWithWriter(out io.Writer) HandlerFunc
func WrapF(f http.HandlerFunc) HandlerFunc //将http.HandlerFunc包装成中间件
func WrapH(h http.Handler) HandlerFunc //将http.Handler包装成中间件
3.2、如何去除默认中间件
//去除默认全局中间件
r := gin.New()//不带中间件
4、中间件的位置
4.1、全局加
func main() {
r := gin.Default()
//方式一
r.Use(func(c *gin.Context) {
fmt.Println("hello start")
})
//方式二
r.Use(M1)
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
})
r.Run()
}
func M1(c *gin.Context) {
fmt.Println("hello start")
}
4.2、路由组加
func main() {
r := gin.Default()
v1 := r.Group("/v1", gin.Logger(), gin.Recovery())
{
v1.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
})
v1.GET("/test", func(c *gin.Context) {
c.String(200, "Hello Test")
})
}
r.Run()
}
4.3、路由明细加
func main() {
r := gin.Default()
r.GET("/", gin.Recovery(), gin.Logger(), func(c *gin.Context) {
c.String(200, "Hello World")
})
r.Run()
}
5、自定义中间件
//方法1
func MyMiddleware(c *gin.Context) {
//中间件逻辑
fmt.Println("hello")
}
func main() {
r := gin.Default()
r.Use(MyMiddleware)
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
})
r.Run()
}
6、拦截器
func MyMiddleware(c *gin.Context){
//请求前逻辑
c.Next()
//请求后逻辑
}
- gin内置的几个中断用户请求的方法: 返回200,但body里没数据
func (c *Context) Abort()
func (c *Context) AbortWithError(code int, err error) *Error
func (c *Context) AbortWithStatus(code int)
func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{}) //中断请求后,返回json格式的数据
// 示例1:
func MyMiddleware(c *gin.Context) {
c.Set("key", 1000) //请求前
c.Next()
c.JSON(http.StatusOK, c.GetInt("key")) //请求后
}
func main() {
r := gin.New()
r.GET("test", MyMiddleware, func(c *gin.Context) {
k := c.GetInt("key")
c.Set("key", k+2000)
})
r.Run()
}
本文正在参加技术专题18期-聊聊Go语言框架