Python requests移除PreparedRequest的Content-Length触发TypeError问题
问题原因
- 你的请求体通过
json.dumps(data)生成,返回结果是字符串类型,不是字节类型。 - 保留
Content-Length头时,requests在请求预处理阶段会自动把字符串类型的请求体编码为字节类型,同时根据字节长度计算并设置Content-Length的值,底层socket传输的是字节数据,因此运行正常。 - 当你主动删除
Content-Length头后,requests底层会自动启用分块传输编码(Transfer-Encoding: chunked),该模式下requests不会对请求体做自动编码处理,会直接把传入的字符串传给socket的发送方法,而socket仅支持接收字节类型数据,因此抛出类型错误。
解决方案
- 方案一:手动将请求体转为字节类型,将原代码中
data=json.dumps(data)修改为data=json.dumps(data).encode('utf-8')即可。 - 方案二:使用requests自带的json参数传参,不需要自行序列化,直接替换为
json=data,requests会自动处理序列化、编码、请求头配置逻辑,即使删除Content-Length头也不会报错。 - 方案三:如果不需要使用分块传输,仅需要调整
Content-Length的取值,不要直接删除该头,手动计算请求体字节长度后重新给该头赋值即可。
内容的提问来源于stack exchange,提问作者LuKe Lukes
相关产品推荐
相关产品推荐

