requests.get报ChunkedEncodingError但Postman访问正常如何解决?
解决方法
方案1:使用stream模式跳过严格的分块校验
出现该错误的核心原因是内部服务返回的Transfer-Encoding: chunked格式不符合标准规范,Postman对非标准响应容错性更高,而requests默认会严格校验分块长度,遇到空分块就会抛出异常。开启stream模式直接迭代原始字节即可绕过校验:
import requests # 新增stream=True参数不触发自动分块解析 r = requests.get(url, params=params, stream=True) pdf_bytes = b"" # 迭代原始响应块,过滤空内容块 for chunk in r.iter_content(chunk_size=4096): if chunk: pdf_bytes += chunk # 保存PDF文件 with open("result.pdf", "wb") as f: f.write(pdf_bytes)
方案2:对齐Postman请求头
内部服务可能会校验请求头特征,requests默认请求头和Postman不一致,会导致服务端返回异常响应。将Postman发送的所有请求头完整复制到代码中即可:
import requests # 替换为你自己Postman请求中的完整头信息 headers = { "User-Agent": "PostmanRuntime/7.32.2", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive" } r = requests.get(url, params=params, headers=headers, stream=True) # 后续和方案1一致,迭代获取内容
如果是自签证书的内部HTTPS接口,可新增verify=False参数跳过证书校验。
方案3:使用urllib3底层请求绕过requests封装
如果上述方案均无效,直接使用urllib3发送请求,完全绕过requests的分块解析逻辑:
import urllib3 # 内部服务如果是自签HTTPS,可添加cert_reqs='CERT_NONE'跳过校验 http = urllib3.PoolManager(cert_reqs='CERT_NONE') response = http.request("GET", url, fields=params) with open("result.pdf", "wb") as f: f.write(response.data)
内容的提问来源于stack exchange,提问作者wkgrcdsam
相关产品推荐
相关产品推荐

