如何在Golang中间件中读取响应体两次?

时间:2017-10-26 07:20:14

标签: http go tcp

在中间件中,我想读取请求主体以执行一些检查。然后,请求被传递到下一个中​​间件,在那里将再次读取正文。 这就是我的所作所为:

bodyBytes, _ := ioutil.ReadAll(req.Body)
req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// use bodyBytes
// pass to next middleware

现在,req.Body.Close什么都不做。自从前面的req.Body.Close实现做了一些连接处理后它会不会破坏?

1 个答案:

答案 0 :(得分:13)

  

自从之前的req.Body.Close实现进行了一些连接处理后它会不会中断?

没有

但是你的代码是错误的:一旦你完成所有这些操作,你应该关闭req.Body。然后你就像你一样构建一个新的ReadCloser并将它交给下一个中间件(它本身或者其他东西负责关闭它。)

bodyBytes, _ := ioutil.ReadAll(req.Body)
req.Body.Close()  //  must close
req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))