[Go - Note] http.Response.Body 多次读取处理

Arboat · · 1688 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

问题

在使用gin框架时(其他框架或原生request也类似)遇到需要先读取body再把body作为参数传给其他函数或方法处理的情况,但用

c.ShouldBindJSON()

读取body后,再次读取body为空或出错。

解决方案

利用 ioutil包提供的以下函数

// ReadAll reads from r until an error or EOF and returns the data it read.
// A successful call returns err == nil, not err == EOF. Because ReadAll is
// defined to read from src until EOF, it does not treat an EOF from Read
// as an error to be reported.
func ReadAll(r io.Reader) ([]byte, error)

// NopCloser returns a ReadCloser with a no-op Close method wrapping
// the provided Reader r.
func NopCloser(r io.Reader) io.ReadCloser

具体代码参考如下:

var receiveBody XXX
bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
err := json.Unmarshal(bodyBytes, &receiveBody)
    if err != nil {
        ...........
        return
    }
c.Request.Body.Close() //  must close
c.Request.Body=ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
c.Set("aaa", aaa)

此外,如以上代码所示,可以用c.Set()写入键值对,后续可以用c.GetString("aaa")方式获得该值。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:Arboat

查看原文:[Go - Note] http.Response.Body 多次读取处理

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1688 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传