2 回答
TA贡献1784条经验 获得超2个赞
查看 Gin API 文档,您需要调用context.Abort()而不是从您的方法返回。
Abort 停止系统继续调用链中的挂起处理程序。假设您有一个授权中间件,如果授权失败(密码不匹配),它会验证请求是否获得授权。应调用此方法 (Abort()) 以停止实际处理程序的执行。
所以在你的具体情况下
if appId == "" { c.JSON(http.StatusOK, gin.H{"code": "MISSING_APP_ID", "message": "Your request is missing an application id"}) c.Abort() return }
TA贡献2021条经验 获得超8个赞
你需要做:
if condition {
c.Abort()
} else {
c.Next()
}
解释
(注意:这建立在@Landers 的回答之上)
c.Abort()只是设置一些内部标志,以某种方式标记上下文,指示异常终止。这是有道理的,它是一个不返回任何内容的无参数方法,因此您只是为了它的副作用而调用它。
同样的事情 c.Next()
由于 go 的控制流(没有异常或跳转),很明显这两个方法不会立即采取任何行动,而是为下一阶段“设置舞台”,想象一下调用您的CheckAppIdfunc 的Gins 代码:
// gin code
doStuff()
ctx := getContext()
// this is your CheckAppId
nextAction := FindAction()
nextAction(&ctx)
// here the context is evaluated to see if you either abort or continue.
checkContextStatus(&ctx)
因此,如果您正在调用c.Abort(),然后c.Next()您将覆盖中止指示。
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报