gin框架中断当前网络请求代码执行的 2种方法总结 - panic, Abort() , return

16 篇文章 0 订阅

在go语言的开发中,我们要中断当前代码执行 可以使用 return 语句来中断当前代码的执行。 return 语句中断的是当前函数的代码执行。 在gin框架中,如果要中断当前的网络请求,有2种方法。

1. Abort() 方法 + return 语句

在gin框架中,要中断当前网络请求,需要使用 Abort() 方法+return语句才能实现。 

return 语句   中断当前的代码块执行; gin上下文中的Abort()方法 中的后续的gin网络请求。

c gin.Context 控制器上下文中的网络请求中断示例:

func (a *xxx) Hello(c *gin.Context) {
	age:= c.QueryInt("age")
	if age<18 {
		c.JSON(200,&gin.H{"msg":"Sorry, 少儿不宜!"})
		return // 直接中断当前网络请求, 这里必须使用return 返回,否则后面的代码还会被执行
	}

	if age>18 {
		// 业务逻辑 ......

		c.JSON(200,&gin.H{"msg":"Welcome to learn Golang!"})
	}

}

在中间件middleware中中断当前网络请求

在gin框架的中间件中,需要中断当前网络请求,必须使用 c.Abort() + return 配合才能中断当前网络请求。


func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		name := c.Query("name")
		if name!="root" {
            log.Println("You are not authorized to log")
			c.Abort() // 中断后续请求
			return // 中断当前代码块
		}

		// 设置 example 变量
		c.Set("example", "12345")

		// 请求前

		c.Next()

	

		// 获取发送的 status
		status := c.Writer.Status()
		log.Println(status)
	}
}



func main() {
	r := gin.New()
	r.Use(Logger())

	r.GET("/test", func(c *gin.Context) {
		example := c.MustGet("example").(string)

		// 打印:"12345"
		log.Println(example)
	})

	// 监听并在 0.0.0.0:8080 上启动服务
	r.Run(":8080")
}


 

2. 使用panic函数直接抛异常方式中断当前网络请求

        在go语言中,panic语句用于触发一个运行时错误,立即停止当前函数的执行,并开始回溯调用栈,直到遇到recover程序终止。 

        这个panic函数可谓是无敌级别的请求中断语句,他可中断任何的代码,不管你是在中间件中还是在控制器中, 只要他被执行,在它后面的代码都会被立即终止执行。

示例:  下面这个函数,不管你在任何地方,只要调用了这个函数,当前函数所在后面的任何代码都不会被执行。

// 中断当前请求
func ReqExit(msg string) {
	panic(msg)
}

总结:gin框架中要中断当前请求并返回可以调用gin上下文中的内容输出相关方法,如JSON()方法, 不过需要注意这个方法调用后,他后面的代码还会被执行,除非你执行return或者 panic语句。

 gin相关源码 参考

func (c *Context) JSON(code int, obj any) {
	c.Render(code, render.JSON{Data: obj})
}

// Render writes the response headers and calls render.Render to render data.
func (c *Context) Render(code int, r render.Render) {
	c.Status(code)

	if !bodyAllowedForStatus(code) {
		r.WriteContentType(c.Writer)
		c.Writer.WriteHeaderNow()
		return
	}

	if err := r.Render(c.Writer); err != nil {
		// Pushing error to c.Errors
		_ = c.Error(err)
		c.Abort()
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值