如何解决禁用 json 绑定验证
我正在使用 gin 创建网络服务。
gin 具有 Bind(&request)
,它根据结构中提供的标签验证请求。
如果验证失败,则返回错误。
但我希望记录无效请求。我如何获取请求 json?
type SignupRequest struct {
FirstName string `json:"first_name" binding:"required"`
AssociatedBank string `json:"associated_bank" binding:"required"`
}
...
srj := NewSignupRequest()
err = c.Bind(srj)
如果请求失败,我将没有要记录的请求数据。
解决方法
想到两个选项。
-
要在 Gin 中完成这一切,请使用
c.ShouldBindWithBody(...)
,它具有将请求正文存储在键gin.Context.BodyBytesKey
下的上下文键/值映射中的副作用。这里是 ShouldBindWithBody 的实现,供参考: https://github.com/gin-gonic/gin/blob/master/context.go#L711 -
除此之外,您还可以从 gin.Context 以
c.Request
的形式访问请求本身。这是一个标准的 net/http.Request,其中列出了所有可用的功能: https://golang.org/pkg/net/http/#Request(读取正文、标题等)。
对于选项 2,我自己没有测试过,但我希望因为 c.Bind(...) 在幕后从请求正文中读取,您可能会发现从 c.Request.Body 读取c.Bind() 失败后不会给你完整的请求正文(它已经至少部分地,如果不是全部,在 c.Bind() 中读取)。在这种情况下,您可能需要调整代码以自己从请求读取到字节缓冲区,然后自己从字节缓冲区绑定(编组)到 SignupRequest。这样,如果绑定失败,您将拥有要记录的原始字节或做任何您想做的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。