Gin中使用中间件| 青训营

287 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

为什么要使用中间件

为了把认证和错误请求检验的逻辑与业务代码分离,把把认证过程放到中间键

怎么理解

如果使用过Java的spring体系,大概类似于过滤器的作用,拦截请求然后继续转发

使用

Gin的中间件是通过Use方法设置的,它接收一个可变参数,所以我们同时可以设置多个中间件。

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes

到了这里其实我们应该更加明白了,一个Gin的中间件,其实就是Gin定义的一个HandlerFunc,而它在我们Gin中经常使用,比如:

r.GET("/", func(c *gin.Context) { fmt.Println("首页") c.JSON(200, "") }) 后面的func(c *gin.Context)这部分其实就是一个HandlerFunc。

示例代码


func main() {
	// 新建一个没有任何默认中间件的路由
	r := gin.New()

	// 全局中间件
	// Logger 中间件将日志写入 gin.DefaultWriter,即使你将 GIN_MODE 设置为 release。
	// By default gin.DefaultWriter = os.Stdout
	r.Use(gin.Logger())

	// Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500。
	r.Use(gin.Recovery())

	// 你可以为每个路由添加任意数量的中间件。
	r.GET("/benchmark", MyBenchLogger(), benchEndpoint)

	// 认证路由组
	// authorized := r.Group("/", AuthRequired())
	// 和使用以下两行代码的效果完全一样:
	authorized := r.Group("/")
	// 路由组中间件! 在此例中,我们在 "authorized" 路由组中使用自定义创建的 
    // AuthRequired() 中间件
	authorized.Use(AuthRequired())
	{
		authorized.POST("/login", loginEndpoint)
		authorized.POST("/submit", submitEndpoint)
		authorized.POST("/read", readEndpoint)

		// 嵌套路由组
		testing := authorized.Group("testing")
		testing.GET("/analytics", analyticsEndpoint)
	}

	// 监听并在 0.0.0.0:8080 上启动服务
	r.Run(":8080")
}

默认中间件

使用gin.Default创建路由时,会默认使用Logger和

不使用默认的中间件Recovery中间件

r := gin.New()

// Default 使用 Logger 和 Recovery 中间件
r := gin.Default()

常用中间件

  • jwt认证 生成token与token认证
  • 限流 基于ip的限流或者基于访问频率的限流