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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:04:51