python使用request库,出现 Connection broken: IncompleteRead

本文介绍了解决Python中使用requests库时遇到的ChunkedEncodingError问题的方法。通过将HTTP版本从1.1改为1.0,可以避免在解析chunked编码时出现错误。此外,还提到了确保请求头部包含Host字段的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1) 场景,

    python使用request库,出现如下错误.python2.7, requests 2.5.1 

ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

   好好的东西,怎么突然出现这个情况,蛋疼无比

具体的堆栈调用

就是使用requests的post

一看requests的源码,就发现,是在解析stream中的chunked的时候报错了.

补充知识: http的chunked请参考: http://blog.csdn.net/zhangboyj/article/details/6236780 

因为请求的代码是别人的服务器,没办法让对方修改.

一般情况下http返回数据,都会有个Content-Length的东西.但是在chunked的情况下,就没了.

这时候,我们需要改变一下策略.

chunked是http1.1才有的东西,

我们将http请求的版本,修改为1.0

使用curl命令可以添加一个参数 -0或者-1 

curl -0 http://xx.com -v 

可以看到提交请求的头HTTP/1.0

curl -1 http://xx.com -v 

可以看到提交请求的头HTTP/1.1

现在为了保留大部分代码都不变的情况,需要修改requests发送http请求的时候,修改为1.0的http头

import httplib
httplib.HTTPConnection._http_vsn = 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
header = {
    'Content-Type': 'application/json;',
    'Host':'www.xxxx.com'
}
resp = requests.post(url=url, data='{}', headers= header ,timeout=120)

某些情况下,居然一定要带Host.请留意

然后继续请求,通过wireshark抓包可以看到.

从返回的数据包里面,没有看到chunked的字样了,不过也没Content-Length

 

备注: https://github.com/ryanmcgrath/twython/issues/288

       上面链接说更新requests版本到2.12.1就没问题了.

 

转载于:https://my.oschina.net/u/1538135/blog/858467

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值