使用中间件
//定义中间件
func m1(c *gin.Context) {
fmt.Println("m1 in ...")
start := time.Now()
c.Next()//调用后续的处理函数
cost := time.Since(start)
fmt.Printf("cost:%v\n", cost) //统计耗时
//c.Abort()//阻止调用后续处理函数
}
例如这个中间件就是用来计算执行某个函数所需要耗费的时间
func main() {
r := gin.Default()
r.Use(m1) //全局注册中间件函数
r.GET("/index1", func(c *gin.Context) {
fmt.Println("index")
c.JSON(http.StatusOK, gin.H {
"message" : "index",
})
})
r.GET("/shop", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg" : "shop",
})
})
r.GET("/user", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H {
"msg" : "user",
})
})
r.Run(":9090")
}
在这里使用了r.Use表示全局注册这个中间件,这样后面的GET方法在调用方法之前都会执行这个中间件来计算函数执行的时间,如果有多个中间件,都在Use函数里面申请即可
如果想为某个函数单独注册中间件
r.GET("/index1",m3, func(c *gin.Context) {
fmt.Println("index")
c.JSON(http.StatusOK, gin.H {
"message" : "index",
})
})
这样就表示单独为后面的函数注册了m3中间件
跨中间件存取值
func m2(c *gin.Context) {
fmt.Println("m2 in ...")
c.Set("name","asb")
c.Next()//调用后续的处理函数
fmt.Println("m2 out ...")
}
例如这样,后续的操作就能根据name拿到“asb”了
r.GET("/index1", func(c *gin.Context) {
fmt.Println("index")
name, ok := c.Get("name")
fmt.Println(name)
if !ok {
name = "匿名用户"
}
c.JSON(http.StatusOK, gin.H {
"message" : name,
})
})
gin.Default()和gin.New()
gin.Default()默认使用了Logger和Recovery中间件,LOgger中间件将日志写入gin.Defaultwriter,Recovery中间件会recover任何panic,如果不想使用上面两个默认中间件可以使用gin.New()新建一个没有任何默认中间件的路由.
gin中间件使用goroutine
当在中间件或者handler中启动新的gorountine时,不能使用原始的上下文c *gin.Context,必须使用其只读副本(c.Copy())