title: 【转载】golang 复用 http.request.body
date: 2021-07-06 11:14:22
comment: false
toc: true
category:
- Golang
tags: - 转载
- Go
- golang
- 复用
- http
- request
- body
本文转载自:golang 复用 http.request.body - Go 语言中文网 - Golang 中文社区
问题及场景#
业务当中有需要分发 http.request.body 的场景。比如微信回调消息只能指定一个地址,所以期望可以复制一份消息发给其他服务。由服务 B 和接收微信回调的服务 A 一起处理微信回调信息。
解决思路#
最开始考虑的是直接转发 http.request。使用ReverseProxy直接将 http.request 由服务 A 转发给服务 B。但是微信涉及到验证等问题,完全调整好非常麻烦。所以转换思路,打算将 http.request.body 的内容直接 post 给服务 B。
可是 http.request 是 readcloser。我们将 http.request readAll 的时候讲无法再次读取 http.request 里面的信息。
如何才能将 http.request.body 复制使用呢?#
其中 c 表示的是 http 的上下文
// 把request的内容读取出来
var bodyBytes []byte
if c.Request.Body != nil {
bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
}
// 把刚刚读出来的再写进去
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
1. 我们先将 body 从 http.request 里面读取出来,保存到一个变量里面。
2. 然后再将变量里面的数据使用 ioutil.NopCloser 方法写回到 http.request 里面。
https://golang.org/pkg/io/ioutil/#NopCloser
NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r.
NopCloser 用一个无操作的 Close 方法包装 Reader r 返回一个 ReadCloser 接口。
这样我们就可以再次使用 c.request 来进行处理了。