banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

【转载】golang复用http.request.body

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 来进行处理了。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。