如何多次读取http.Response.Body?

jdxj · 2018-04-03 15:33:31 · 6318 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-03 15:33:31 的主题,其中的信息可能已经有所发展或是发生改变。

  1. 我有多个函数处理同一个resp.Body,第一个函数处理后调用了resp.Body.Close()函数。第二个函数读时报了http2: response body closed错误,请问如何多次读取http.Response.Body
  2. 看到有一个解决办法是使用func NopCloser(r io.Reader) io.ReadCloser函数。文档描述是NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r.。如果我使用这个方法后,我是否还应该调用Close()方法?

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

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

6318 次点击  
加入收藏 微博
11 回复  |  直到 2018-05-14 15:30:25
wxs_QQT
wxs_QQT · #1 · 7年之前

666特赞😢

wxs_QQT
wxs_QQT · #2 · 7年之前

666

wxs_QQT
wxs_QQT · #3 · 7年之前

还能说什么呢,太棒了

hahahaha
hahahaha · #4 · 7年之前

为什么不把resp.Body的值保存在变量里面呢

jong
jong · #5 · 7年之前

方法2的思路是对的,为了保证使用的一致性,Close方法还是需要调用的,具体实现看httputil包

marlonche
marlonche · #6 · 7年之前

如果Response在多个地方被使用并且里面的body被同步重复读取,那么有必要自定义一个类实现io.ReadCloser,类里面可以用bytes.Reader对象实现,这个类的Close接口可以调用bytes.Reader的Seek方法定位到buffer的起始位置以便下次重新使用

linkerlin
linkerlin · #7 · 7年之前

为何要多次读取呢?

254244460
254244460 · #8 · 7年之前

如果你是用http下载,resp.Body可能有几个G,要是默认把body复制到内存不是早崩了?建议查查清楚什么是流。

13728605342
13728605342 · #9 · 7年之前

看看这个,应该能帮到你们:https://cloud.tencent.com/developer/doc/1101

buscoop
buscoop · #10 · 7年之前
1372860534213728605342 #9 回复

看看这个,应该能帮到你们:https://cloud.tencent.com/developer/doc/1101

呵呵,你就扔个手册,就能帮助啦

fwhez
fwhez · #11 · 7年之前

resp 拿一次,存放需要的进内存

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