【问题标题】:Disable json binding validation禁用 json 绑定验证
【发布时间】:2021-08-08 10:49:17
【问题描述】:

我正在使用 gin 来创建 Web 服务。

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)

如果要求失败,我将没有要记录的请求数据。

【问题讨论】:

    标签: go go-gin


    【解决方案1】:

    我想到了两个选项。

    1. 要在 Gin 中完成这一切,请使用 c.ShouldBindWithBody(...),它的副作用是将请求正文存储在键 gin.Context.BodyBytesKey 下的上下文键/值映射中。以下是 ShouldBindWithBody 的实现供参考: https://github.com/gin-gonic/gin/blob/master/context.go#L711

    2. 除此之外,您还可以从 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。这样,如果绑定失败,您就可以记录原始字节或执行任何其他操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多