go gin 中间件

271 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

中间件

中间件,在正式处理 http 请求之前,进行一层逻辑控制,类似于拦截器。请求前拦截,比如可以进行登录时效验证,或日志记录,或捕获错误等等。但不像 Java 语言,通过注解的方式写在控制器或者方法的之上。在 Go 中是将其用在路由之前的。

在gin 中,直接使用 gin.Default() 初始化 gin 对象,其中它包含了一个自带默认中间件的 *Engine。观察以下代码,你会发现 Default 方法中默认绑定了2个中间件,Logger 和 Recovery,主要用于打印日志输出和 panic 处理

func Default() *Engine {
  debugPrintWARNINGDefault()
  engine := New()
  engine.Use(Logger(), Recovery())
  return engine
}

在 Go gin中的中间件使用方式如下,通过使用 Use 方法设置的,它接收一个可变的参数:

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

所以,中间件必须是能够返回 HandlerFunc 类型的函数。

// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context)

自定义中间件

了解中间件的定义,那可以自定义中间件。只要我们自己实现一个HandlerFunc,就可以自定义一个自己的中间件。

func CustomMiddleware() gin.HandlerFunc {
  return func(ctx *gin.Context) {
    ctx.String(200, "success")
  }
}
​
// 使用
r.use(CustomMiddleware)

根据中间件注册位置划分,可以分为

  • 全局中间件:所有的请求都经过中间件
  • 局部中间件:只针对部分注册的路由生效。如果将中间件在某路由下注册,则只针对该路径下有效。比如再耨个群组路由下,或者说在某单个路由下。

Next() 方法

Next() 只允许在中间件函数中使用,用于挂起请求业务逻辑处理。即当前中间件中调用c.Next()时会中断当前中间件中后续的逻辑,转而执行后续的中间件和handlers,等他们全部执行完以后再回来执行当前中间件的后续代码。

func CustomMiddleware() gin.HandlerFunc {
  return func(ctx *gin.Context) {
    println("hello before")
    ctx.Next()
    println("hello after")
    ctx.String(200, "success")
  }
}