Gin框架学习——路由分组与中间件

442 阅读2分钟

今天又了解了一下gin框架中路由分组的实现与中间件的实现

问题

在日常使用中,经常会有如下的操作比如对于用户的一些路由,会在之前加上例如/user,来划分路由, 然而每次在路由前加入/user一旦接口多了会显得繁杂,那么该如何简便的在gin中应该如何实现呢?

例子

如下为一个例子使用gin自带的group方法来进行路由分组

func main() {
   r := gin.Default() //携带基础中间件的形式启动
   v1 := r.Group("/v1") //划分了一个v1路由
   v1.POST("/test", func(c *gin.Context) { //在v1下设置url,完整的url为/v1/test
      fmt.Println("我在handler中执行")
      c.JSON(200,gin.H{
         "success" : "ok",
      })
   })
   r.Run(":8080") // listen and serve on 0.0.0.0:8080
}

使用Postman进行测试效果如下

image.png

中间件

在实际开发中,有时我们需要对一个请求进行操作,例如登录鉴权等等,那么就会使用到相应的中间件,在gin框架中也为我们准备了默认的中间件,进入源码我们会看到

func Default() *Engine {
   debugPrintWARNINGDefault()
   engine := New()
   engine.Use(Logger(), Recovery()) //此处就是gin自带的两个中间件函数了,Logger和Recovery
   return engine
}

那么我们如何自定义中间件函数呢?

其实十分简便只需要在路由之后加上一个Use方法将函数放入即可

v1 := r.Group("/v1").Use(middleware1(),middleware2()) //也可以使用链式调用

但是函数需要满足如下标准:

func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
   group.Handlers = append(group.Handlers, middleware...)
   return group.returnObj()
}

从源码中可以看到需要一个返回HandlerFunc的函数,而HandlerFunc的类型如下

type HandlerFunc func(*Context)

所以可以这么定义两个中间件

func middleware1() gin.HandlerFunc {
   return func(c *gin.Context) {
      fmt.Println("我在handler之前执行,我是中间件1号")
      c.Next()
      fmt.Println("我在handler之后执行,我是中间件1号")
   }
}

func middleware2() gin.HandlerFunc {
   return func(c *gin.Context) {
      fmt.Println("我在handler之前执行,我是中间件2号")
      c.Next()
      fmt.Println("我在handler之后执行,我是中间件2号")
   }
}

中间件执行的方式如下: image.png

因此,执行效果如下所示 image.png

本文正在参加技术专题18期-聊聊Go语言框架