golang+gin框架中间件Next() 和 传递值的问题

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")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值