Go:如何拷贝响应流的数据

1,531 阅读1分钟

在使用Gin框架时需要在中间件获取到响应流而又不能影响输出的结果,因此使用一个小技巧去获取响应流的内容同时不影响输出结果。

构造能够自动拷贝的响应流

type bodyLogWriter struct {
	gin.ResponseWriter
	body *bytes.Buffer
}

func (w bodyLogWriter) Write(b []byte) (int, error) {
	w.body.Write(b)
	return w.ResponseWriter.Write(b)
}

上面的代码继承了gin的响应流,同时添加了body属性用于记录拷贝的内容,重写Write()方法,把字节同时写到输出流(ResponseWriter)和拷贝流(body)。

使用方式

需要把gin.Context.Writer替换为上面的bodyLogWriter,如下所示:

func(c *gin.Context) {
    blw := &bodyLogWriter{
	body: bytes.NewBufferString(""),
	ResponseWriter: c.Writer,
    }
    c.Writer = blw
    // 其他代码
}

出处

代码来自掘金小册基于 Go 语言构建企业级的 RESTful API 服务