Golang多次读Response Body

357 阅读1分钟

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)
}