Gin 中间件
Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函 数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、 记录日志、耗时统计等。
通俗的讲:中间件就是匹配路由前和匹配路由完成后执行的一系列操作
ctx.Next()调用该请求的剩余处理程序
-
中间件里面加上 ctx.Next()可以让我们在路由匹配完成后执行一些操作,先完成回调函数后面的程序,在执行c.Next()下面的语句
-
//统计一个请求的执行时间 func initMiddleware(c *gin.Context) { start := time.Now().UnixNano() fmt.Println("1-我是一个中间件") //调用该请求的剩余处理程序 c.Next()//去执行回调函数外的语句 fmt.Println("2-我是一个中间件") end :=time.Now().UnixNano() fmt.Println(end-start) }
一个路由可以配置多个中间件
全局中间件
r := gin.Default()
//全局中间件
r.Use(initMiddlewareOne,initMiddleware)
中间件和对应控制器之间共享数据
设置值:
ctx.Set("username", "张三")
获取值:
//_ :不接受err
//获取值
username, _ := c.Get("username")
//get返回的是控接口类型,需要转换为string类型
v,ok :=username.(string)
if ok == true{
//成功:
c.String(200,"用户列表:"+v)
}else {
c.String(200,"用户列表:获取用户失败")
}
gin.Default()
默认使用了 Logger 和 Recovery 中间件,其中: • Logger 中间件将日志写入 gin.DefaultWriter,即使配置了 GIN_MODE=release。 • Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500 响应码。 如果不想使用上面两个默认的中间件,可以使用 gin.New()新建一个没有任何默认中间件的 路由。
gin 中间件中使用 goroutine
当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context), 必须使用其只读副本(c.Copy())
//定义一个goroutine统计日志
cCp :=ctx.Copy()
go func() {
time.Sleep(5 * time.Second)
fmt.Println("Done! in path " + cCp.Request.URL.Path)
}()