golang http client.Do(req)无法二次使用

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

初始化client,以及request竟然无法调用第二次,奇了八怪。

没怎么深入阅读源码,但是知道问题出在哪了。

首先代码长这样:

resp, err := client.Do(req)
resp, err := client.Do(req)

本来想着过一段时间刷新一下数据,来看看数据有什么变化,所以就想着能复用req,但是没想到报错:

: http: ContentLength=15 with Body length 0

这是为什么呢。深入调查了一下,先看下req长啥样

req, err = http.NewRequest("POST", "some url", strings.NewReader("articleId="+articleId))

其中第三个参数就是body,
req.Body长这样:

type Reader struct {
    s        string
    i        int64 // current reading index
    prevRune int   // index of previous rune; or < 0
}

看到这就突然明白了,client.Do方法在读取body数据时会根据Reader中的i值进行读取,即调用其Read方法,i值都会改变,当然读取完,i值也就变成contentLength。那么下次再进行使用的时候,因为读取不出任何数据,导致如上错误 Body length 0

这种情况应该怎么解决呢。

。。。

new一个新的Reader...


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

本文来自:简书

感谢作者:咣咣当

查看原文:golang http client.Do(req)无法二次使用

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

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