今天又了解了一下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进行测试效果如下
中间件
在实际开发中,有时我们需要对一个请求进行操作,例如登录鉴权等等,那么就会使用到相应的中间件,在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号")
}
}
中间件执行的方式如下:
因此,执行效果如下所示
本文正在参加技术专题18期-聊聊Go语言框架