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

Ser*_*gey 9 tcp http go

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

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

现在,req.Body.Close什么都不做.自从上一次req.Body.Close实现做了一些连接处理以来它会破坏吗?

Vol*_*ker 19

自从上一次req.Body.Close实现做了一些连接处理以来它会破坏吗?

没有.

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

bodyBytes, _ := ioutil.ReadAll(req.Body)
req.Body.Close()  //  must close
req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
Run Code Online (Sandbox Code Playgroud)

  • 在服务器端,您无需关闭请求正文.[`Request.Body`](https://golang.org/pkg/net/http/#Request):_"服务器将关闭请求正文.ServeHTTP处理程序不需要."_ (6认同)