Python使用Requests获取流式REST API时无法逐块接收数据的问题排查
问题原因与解决方法
你当前代码的问题在于:response.text会强制把整个响应的所有内容一次性加载到内存中,哪怕你设置了stream=True也没用。这个属性的设计就是读取完整响应,所以你拿到的自然是所有JSON列表的拼接结果,没法逐块处理。
要实现和JavaScript Fetch API一样的逐块接收效果,得用requests库提供的流式迭代方法:
正确的实现方式
1. 按服务器分块迭代(推荐)
如果API用的是HTTP分块传输(Transfer-Encoding: chunked),直接用response.iter_content()来逐个获取服务器发送的块:
import requests import json response = requests.get(url, stream=True) response.raise_for_status() # 迭代每个分块,chunk_size设为None让requests自动处理服务器的分块大小 for chunk in response.iter_content(chunk_size=None): if chunk: # 跳过空块 # 解码字节为字符串,再解析成JSON chunk_data = json.loads(chunk.decode('utf-8')) print(f"收到100条记录:{len(chunk_data)}") # 这里处理单块数据,比如写入数据库、逐条处理等
2. 按行迭代(如果API是每行返回一个JSON列表)
如果API的分块是按换行分隔的,用response.iter_lines()更方便:
import requests import json response = requests.get(url, stream=True) response.raise_for_status() for line in response.iter_lines(): if line: # 跳过空行 chunk_data = json.loads(line.decode('utf-8')) print(f"收到100条记录:{len(chunk_data)}") # 处理单块数据
注意事项
- 确保API确实是逐块发送独立的JSON列表,如果服务器是把多个JSON拼在一起发送(没有分块),那你需要自己处理拆分逻辑,比如按
][分割后补全括号再解析。 - 迭代过程中如果需要中断,直接
break即可,requests会自动关闭连接。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

