在 Gin 中,我可以调用与 context.bindJSON 等效的东西,而不在失败时设置 HTTP 状态

问题描述 投票:0回答:1

我有一个使用 Gin 的 API,我遇到一个问题:请求可能或可能不包含 JSON 对象,如果不包含 JSON 对象,我不希望请求失败。

我一直在使用

context.bindJSON
来检索传入的 JSON,如果它存在,它会很好用,但如果它不存在,Gin 上下文会将响应代码设置为 400,一旦写入响应代码,我就无法更改它.

我在一个简单的通用函数中进行编组,如下所示:

func marshalFromRequest[T any](ctx *gin.Context, logFailures bool) (*T, error) {
    var typed T
    if ctx.Request.ContentLength == 0 {
        return nil, nil
    }
    if err := ctx.BindJSON(&typed); err != nil {
        if logFailures {
            log.Printf("Cannot bind incoming data to type: %v", err)
        }
        return nil, err
    }
    return &typed, nil
}

我需要更改什么才能解析出 JSON 对象(如果存在),但如果不存在则能够忽略失败?如果这以完全相同的方式工作,但在请求中缺少 JSON 时没有设置状态代码,那就没问题了。

go go-gin
1个回答
0
投票

您可以使用

ContentType()
检查请求是否有 JSON。

if ctx.ContentType() == gin.MIMEJSON {
  // request has JSON.
  err := ctx.BindJSON(&typed)
    :
} else {
  // request does not have JSON.
    :
}
© www.soinside.com 2019 - 2024. All rights reserved.