You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2.7.x使用requests.get遇ChunkedEncodingError的排查修复求助

排查与修复Python 2.7下requests.get的ChunkedEncodingError问题

嘿,我太懂你维护Python 2.7遗留项目时遇到的这种糟心问题了——明明用curl或者浏览器访问API都正常,偏偏用requests.get就抛出ChunkedEncodingError。这种情况我之前帮不少开发者排查过,咱们一步步来搞定它:

可能的原因

  • 服务器响应不规范:有些服务器返回的分块编码响应不符合标准,而Python 2.7版本的requests(尤其是旧版本)对这种不规范的处理兼容性较差,curl和浏览器则会自动兼容这类问题。
  • requests版本过旧:Python 2.7虽然已经停止官方支持,但requests有针对它的最后兼容版本,旧版本的requests存在分块编码处理的已知bug。
  • 网络中间件干扰:代理、防火墙等中间设备可能截断了部分响应包,curl的默认处理逻辑比旧版requests更能应对这种情况。

修复方案

1. 升级到Python 2.7支持的最新requests版本

这是最优先推荐的方案,因为很多分块编码的bug在后期版本中已经被修复。Python 2.7支持的最后一个requests版本是2.27.1,执行以下命令升级:

pip install requests==2.27.1

升级后再测试你的代码,大概率能直接解决问题。

2. 手动处理分块响应,绕过自动解码

如果升级后问题依然存在,可以通过stream=True禁用requests的自动分块解码,手动读取响应内容:

import requests

url = "http://<ip>:<port>/api/x.x/yz"

# 创建会话并配置适配器
session = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries=3)
session.mount('http://', adapter)

try:
    # 开启stream模式,不自动处理分块编码
    response = session.get(url, stream=True)
    # 手动迭代读取所有响应内容
    content = b''.join(response.iter_content(chunk_size=1024))
    # 如需字符串格式,可解码(根据实际编码调整)
    # content_str = content.decode('utf-8')
finally:
    response.close()

3. 模拟curl的请求头

有些服务器会根据请求头返回不同格式的响应,你可以把requests的请求头改成和curl一致,让服务器返回更规范的响应:

import requests

url = "http://<ip>:<port>/api/x.x/yz"

# 模拟curl的默认请求头(可根据你实际的curl版本调整)
headers = {
    'User-Agent': 'curl/7.68.0',
    'Accept': '*/*'
}

response = requests.get(url, headers=headers)
print(response.text)

4. 添加异常重试机制

如果问题是偶尔的网络波动导致的,给请求加上重试逻辑,捕获ChunkedEncodingError后自动重试:

import requests
from requests.exceptions import ChunkedEncodingError
import time

url = "http://<ip>:<port>/api/x.x/yz"
max_retries = 3
retry_count = 0
success_response = None

while retry_count < max_retries:
    try:
        success_response = requests.get(url)
        success_response.raise_for_status()  # 检查是否有HTTP错误
        break
    except ChunkedEncodingError:
        retry_count += 1
        print(f"请求失败,正在进行第 {retry_count} 次重试...")
        time.sleep(1)  # 间隔1秒重试
    except Exception as e:
        print(f"遇到其他错误: {str(e)}")
        break

if success_response:
    # 处理你的响应内容
    print(success_response.text)
else:
    print(f"经过 {max_retries} 次重试后仍无法成功请求API")

内容的提问来源于stack exchange,提问作者midhun lc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:48:21