在 Go-Gin 中间件中多次读取请求体
在 Go-Gin 中间件中验证请求体数据时,需要访问身体多次。然而,解读和操纵身体可能会导致意想不到的行为。本文解决了如何在验证中间件中多次读取请求正文的问题,确保整个 HTTP 请求周期中的数据完整性。
问题:
开发者遇到的问题他们需要验证请求正文数据并保留经过验证的信息以供后续处理的情况。但是,使用 c.ShouldBindJSON() 将正文读取到结构中会导致后续尝试读取正文返回空响应。
// SignupValidator Middleware func SignupValidator(c *gin.Context) { var user entity.User if err := c.ShouldBindJSON(&user); err != nil { // Validation logic } // Subsequent read attempt bodyBytes, _ := ioutil.ReadAll(c.Request.Body) fmt.Println(string(bodyBytes)) // Empty response }
解决方案:
为了保留请求体并启用多次读取,建议使用ByteBody技术。这涉及到将正文读入缓冲区,可以在不影响后续请求的情况下使用该缓冲区。
// SignupValidator Middleware func SignupValidator(c *gin.Context) { byteBody, _ := ioutil.ReadAll(c.Request.Body) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(byteBody)) var user entity.User if err := c.ShouldBindJSON(&user); err != nil { // Validation logic } c.Next() }
使用此解决方案,byteBody 包含正文数据,可以根据需要多次访问该正文数据。对 ioutil.NopCloser() 的调用创建一个新的读取器,该读取器不会关闭底层缓冲区,从而允许后续读取而不会产生副作用。
以上是如何在Go-Gin中间件中多次读取请求体?的详细内容。更多信息请关注PHP中文网其他相关文章!