gin碰到的路由状态码问题

发布于 2022-09-13 01:24:58 字数 1462 浏览 24 评论 0

// @Tags 用户模块
// @Summary 登录
// @Produce  json
// @Param info body models.Auth false "info"
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /api/v1/login [post]
func GetAuth(c *gin.Context) {
    // appG := app.Gin{C: c}
    // valid := validation.Validation{}
    
    // user := make(map[string]string)
    // c.BindJSON(&user)

    // username := user["username"]
    // password := util.EncodeMD5(user["password"])

    // fmt.Println("password:", password)

    // a := auth{Username: username, Password: password}
    // ok, _ := valid.Valid(&a)

    // appG.SuccessJson(nil)

    c.JSON(200, nil)
    return
}

在以上代码中,我把

// user := make(map[string]string)
// c.BindJSON(&user)

这两行注释掉后,此接口返回的状态码会变成400,不注释的话又是正常的。非常非常不解。。(刚学GO的菜鸟)

下面是相关的截图
image.png

image.png

2021-9-12更新

我发现c.BindJSON(&user)这个方法体里面调用了MustBindWith方法,它会返回异常状态码。

func (c *Context) MustBindWith(obj interface{}, b binding.Binding) error {
    if err := c.ShouldBindWith(obj, b); err != nil {
        c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck
        return err
    }
    return nil
}

类似的c.Bind方法也是如此。如果这样的话,不知大佬们是怎么避免入参校验错误时,仍返回200状态码的?(因为我希望状态码统一设为200,前端通过我JSON中给的code进行错误处理。)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

又怨 2022-09-20 01:24:58

问题已解决。
绑定结构体时使用ShouldBind系列方法
参考:https://www.cnblogs.com/Apale...

烛影斜 2022-09-20 01:24:58

成功时:

c.JSON(http.StatusOK, gin.H{
    "code": 200,
    "msg":  "success",
    "data": data,
})

失败时:

c.JSON(http.StatusOK, gin.H{
    "code": code,
    "msg":  msg,
    "data": data,
})

无论是错误还是正确
只要是没有panic的错误都应该返回200http状态码
调用接口方拿到返回结果以后用code去判断是不是正常返回
要不要抛出msg错误信息

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文