Golang多次读Response Body
在写业务代码的时候遇到了需要多次读Response Body,但是在实际开发的过程中,发现Response Body读了一次之后再读,就读不到数据了。
看了一下源码,大概的原因是当数据被读取之后,Body会把一个closed属性设置为true,之后就不能再读了。
怎么多次读
使用io.NopCloser()
func readBodyAndSetBodyRepeatRead(c *gin.Context, cb func()) {
if s, ok := c.Request.Body.(io.Seeker); ok {
//执行读取Body的操作
cb()
//再次设置可读状态
_, err := s.Seek(0, 0)
if err == nil {
return
}
}
bs, _ := io.ReadAll(c.Request.Body)
_ = c.Request.Body.Close()// NOTE 原始的 Body 无需手动关闭,会在 response.reqBody中自动关闭的.
//设置可读状态
r := bytes.NewReader(bs)
c.Request.Body = io.NopCloser(r)
//执行读取Body的操作
cb()
//再次设置可读状态
_, _ = r.Seek(0, 0)
}