gin框架中间件Next() 和 传递值的问题
1、c.Next()、c.Abort()
(1)、c.Next()
调用请求的剩余处理程序,常用于计算程序执行时间。
例1:
func middleware(c *gin.Context){
fmt.Println("1-这是第一个中间件")
c.Next()
fmt.Println("2-这是第二个中间件")
}
func main(){
//默认路由引擎
r := gin.Default()
r.GET("/",middleware, func(c *gin.Context) {
fmt.Println("这是控制器方法")
})
}
控制器使用中间件的情况下,如果存在Next()方法,触发顺序 “1-这是第一个中间件” -> “这是控制器方法” -> “2-这是第二个中间件”。Next() 会先执行控制器下面的方法,最后执行Next() 后的逻辑。
同理,多个中间件一样,例2:
func middlewareOne(c *gin.Context){
fmt.Println("1-这是第一个中间件")
c.Next()
fmt.Println("2-这是第二个中间件")
}
func middlewareTwo(c *gin.Context){
fmt.Println("3-这是第一个中间件")
c.Next()
fmt.Println("4-这是第二个中间件")
}
func main(){
//默认路由引擎
r := gin.Default()
r.GET("/",middlewareOne,middlewareTwo, func(c *gin.Context) {
fmt.Println("这是控制器方法")
})
}
如果存在Next()方法,触发顺序 “1-这是第一个中间件” -> “3-这是第一个中间件” ->“这是控制器方法” -> “4-这是第二个中间件” -> “2-这是第二个中间件”。Next() 会先执行控制器下面的方法,最后执行Next() 后的逻辑。区别在于,Next()后的逻辑是倒置进行处理的。
(2)、c.Abort()
Abort() 方法是不执行下面的方法,终止请求剩余的控制器。
2、中间件与控制器之间的传值
//设置数据(中间件中)
c.Set("username", "value")
//获取数据(控制器中)
username, _ := c.Get("username")
//注意:这里获取到的username是一个空接口类型(interface{})。使用类型断言转为其他类型,如:
username, _ := username.(string) //转为字符串类型
//如果想要判断获取值是否成功,则把 _ 换成一个键,例如key,这个键返回的是bool类型(true或false)例如:
username, key := username.(string)
if key {
fmt.Println("success")
} else {
fmt.Println("error")
}