如何在 Go Gin 框架中像 PHP 一样随时终止请求处理?
如何像 php 一样在 go gin 框架中任意位置终止请求处理?
在 php 中,可以使用 exit() 函数来随时结束请求处理。而在 go 中,使用 exit 将直接退出整个程序,而无法只终止当前请求的处理。
使用 abort() 方法
gin 框架提供了 abort() 方法,可以随时中止请求处理。例如:
立即学习“PHP免费学习笔记(深入)”;
func login(c *gin.context) { userrequest.loginverify(c) if !userrequest.isvalid() { c.abortwithstatusjson(http.statusunauthorized, gin.h{"errcode": 101, "msg": "参数校验失败"}) return } fmt.println("come on") }
使用中间件
中间件是一种常见的 go 模式,可以通过在请求处理前后插入自定义逻辑来实现。我们可以使用中间件来在任意位置中断请求处理。例如:
func middleware() gin.handlerfunc { return func(c *gin.context) { // 你的 loginverify if c.request.postformvalue("flag") == "1" { c.abortwithstatus(400) return } // before request c.next() // after request } }
使用 panic
在 go 中,还可以通过引发 panic 来中断请求处理。例如:
func Login(c *gin.Context) { userRequest.LoginVerify(c) if !userRequest.IsValid() { panic(&CustomErrorResponse{ Status: 400, Code: 1, Message: "参数校验失败", }) } fmt.Println("come on") } func Middleware() gin.HandlerFunc { return func(c *gin.Context) { defer func() { if e := recover(); e != nil { if err, ok := e.(*CustomErrorResponse); ok { c.AbortWithStatusJSON(err.Status, gin.H{ "Code": err.Code, "Message": err.Message, }) } } }() // before request c.Next() // after request } }