在中间件中,我想读取请求主体以执行一些检查。然后,请求被传递到下一个中间件,在那里将再次读取正文。 这就是我的所作所为:
bodyBytes, _ := ioutil.ReadAll(req.Body)
req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// use bodyBytes
// pass to next middleware
现在,req.Body.Close什么都不做。自从前面的req.Body.Close实现做了一些连接处理后它会不会破坏?
答案 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))