在使用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 服务