安装urllib3≥2后requests无法自动解压gzip响应的问题
urllib3 v2+下requests自动解压gzip响应的问题解析及解决方法
urllib3 v2.x确实调整了自动解压的行为,这是导致你遇到问题的核心原因:
- urllib3 2.0起,默认不再自动处理带有
Content-Encoding: gzip的响应,必须显式启用解压功能。而旧版本requests依赖urllib3的默认解压逻辑,因此升级urllib3后自动解压失效。
解决方法
显式为requests启用自动解压
你可以通过自定义HTTP适配器全局开启解压,或者在单个请求中指定参数:- 全局启用(推荐,适配所有请求):
from requests import Session from requests.adapters import HTTPAdapter class AutoDecodeAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): kwargs["decode_content"] = True super().init_poolmanager(*args, **kwargs) session = Session() session.mount("http://", AutoDecodeAdapter()) session.mount("https://", AutoDecodeAdapter()) # 后续使用session发起请求即可自动解压gzip响应 response = session.get("your-api-url") data = response.json() - 单个请求启用:
import requests response = requests.get("your-api-url", decode_content=True) data = response.json()
- 全局启用(推荐,适配所有请求):
回退urllib3版本(临时方案)
如果你暂时不想适配新版本,可在依赖配置中固定urllib3<2,恢复原有自动解压行为,但这并非长期解决方案。
补充说明
你手动使用zlib.decompress的方式确实能解决问题,但显式启用requests/urllib3的自动解压更贴合原有代码逻辑,无需重复实现解压逻辑。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

