一文搞懂Gin中间件的使用

1,012 阅读2分钟

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语言框架