1

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

gin 会Bind(&request)根据 struct 中提供的标签来验证请求。如果验证失败,则返回错误。

但我希望记录无效请求。如何获取请求 json?

  type SignupRequest struct {
    FirstName      string `json:"first_name" binding:"required"`
    AssociatedBank string `json:"associated_bank" binding:"required"`
}

...

srj := NewSignupRequest()
err = c.Bind(srj)

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

4

1 回答 1

0

我想到了两个选择。

  1. 要在 Gin 中完成这一切,使用c.ShouldBindWithBody(...)它的副作用是将请求正文存储在 key 下的上下文键/值映射中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 之后从 c.Request.Body 读取。 Bind() 失败不会为您提供完整的请求正文(它已经至少部分地,如果不是完全地,在 c.Bind() 中读取)。在这种情况下,您可能必须调整您的代码以自己从请求中读取到字节缓冲区,然后自己从字节缓冲区绑定(编组)到 SignupRequest。这样,如果绑定失败,您将拥有原始字节来记录或做任何您想做的事情。

于 2021-05-20T17:21:26.303 回答