首页 >后端开发 >Golang >如何多次读取 Go-Gin 请求正文?

如何多次读取 Go-Gin 请求正文?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-28 17:04:11896浏览

How to Read a Go-Gin Request Body Multiple Times?

Go-Gin:多次读取请求正文

在 Go-Gin 中,如果您需要访问,读取请求正文可能会很棘手多次。当中间件修改请求正文时,就会出现问题,导致后续访问变得困难。

考虑以下场景:您有一个验证中间件读取请求正文进行验证,后面跟着另一个需要未修改正文的处理程序。在这种情况下,中间件的修改会干扰后续处理程序对原始正文的访问。

要解决此问题,可以使用以下方法:

  1. 将请求正文读入将变量传递给中间件之前:
bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
  1. 将 body 变量传递给中间件并对其进行验证:
if err := c.ShouldBindJSON(&user); err != nil {
    // Validation logic
}
  1. 验证后,使用 io.NopCloser 恢复原始主体:
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(ByteBody))
  1. 现在,bodyBytes 变量包含原始未修改的主体,您可以在后续处理程序中使用它,而无需任何

要在提供的代码中实现此解决方案,请将中间件中的以下行替换:

// var bodyBytes []byte
// if c.Request.Body != nil {
//  bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
// }

替换为:

bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

以上是如何多次读取 Go-Gin 请求正文?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn