我有一个使用 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 时没有设置状态代码,那就没问题了。
您可以使用
ContentType()
检查请求是否有 JSON。
if ctx.ContentType() == gin.MIMEJSON {
// request has JSON.
err := ctx.BindJSON(&typed)
:
} else {
// request does not have JSON.
:
}