HTTP非流式请求 vs HTTP流式请求

news/2025/2/27 8:10:49
http://www.w3.org/2000/svg" style="display: none;">

文章目录

      • HTTP 非流式请求 vs 流式请求
        • 一、核心区别
      • 服务端代码示例(Node.js/Express)
        • 非流式请求处理
        • 流式请求处理
      • 客户端请求示例
        • 非流式请求(浏览器fetch)
        • 流式请求处理(浏览器fetch)
      • Python客户端示例(Requests库)
        • 非流式请求
        • 流式请求处理
      • 关键特性对比
      • 注意事项

HTTP 非流式请求 vs 流式请求

一、核心区别
  1. 非流式请求(传统HTTP请求):

    • 客户端发送完整请求 → 服务端处理 → 返回完整响应
    • 数据一次性完整传输
    • 连接立即关闭
    • 适用于普通API接口
  2. 流式请求(Streaming Request):

    • 建立持久连接通道
    • 服务端可持续分块发送数据
    • 客户端可实时处理数据
    • 适用于实时聊天、大文件传输、日志流等场景

服务端代码示例(Node.js/Express)

非流式请求处理
app.get('/api/normal', (req, res) => {
  // 一次性生成完整数据
  const data = Array.from({length: 5}, (_, i) => `数据块 ${i + 1}`);
  res.json({ 
    status: 'complete',
    data: data
  });
});
流式请求处理
app.get('/api/stream', (req, res) => {
  // 设置流式响应头
  res.setHeader('Content-Type', 'text/plain; charset=utf-8');
  res.setHeader('Transfer-Encoding', 'chunked');

  // 模拟持续发送数据
  let count = 0;
  const interval = setInterval(() => {
    if (count++ < 5) {
      res.write(`数据块 ${count}\n`);
    } else {
      clearInterval(interval);
      res.end(); // 结束流
    }
  }, 1000);
});

客户端请求示例

非流式请求(浏览器fetch)
fetch('/api/normal')
  .then(response => response.json())
  .then(data => {
    console.log('完整数据:', data);
  });
流式请求处理(浏览器fetch)
fetch('/api/stream')
  .then(async response => {
    const reader = response.body.getReader();
    const decoder = new TextDecoder();

    while(true) {
      const { done, value } = await reader.read();
      if(done) break;
      console.log('收到数据块:', decoder.decode(value));
    }
  });

Python客户端示例(Requests库)

非流式请求
import requests

response = requests.get('http://localhost:3000/api/normal')
print("完整响应:", response.json())
流式请求处理
import requests

with requests.get('http://localhost:3000/api/stream', stream=True) as r:
    for chunk in r.iter_content(chunk_size=None):
        if chunk:
            print("实时数据:", chunk.decode('utf-8'))

关键特性对比

特性非流式请求流式请求
响应方式一次性完整返回持续分块返回
内存占用需要完整加载数据按需处理数据块
延迟等待完整数据处理首字节到达即可处理
适用场景常规API请求实时数据/大文件传输
连接持续时间立即关闭保持长连接
客户端处理复杂度简单需要特殊处理逻辑

注意事项

  1. 流式请求需要设置正确的响应头(Transfer-Encoding: chunked
  2. 客户端需要处理连接中断和重连逻辑
  3. 服务端要合理控制并发连接数
  4. 浏览器端需注意跨域问题(CORS配置)
  5. 流式传输更适合使用WebSocket/SSE等专业协议的场景需要考虑技术选型

http://www.niftyadmin.cn/n/5869780.html

相关文章

react native中如何实现吸顶的效果

rn中实现吸顶效果用ScrollView、SectionList、FlatList都可以实现&#xff0c;因为SectionList、FlatList都是继承自ScrollView&#xff0c;都会有stickyHeaderIndices属性&#xff0c;这个属性是一个数组&#xff0c;可以决定下标为几的组件有吸顶的效果。 <FlatListdata{…

【EB-06】SystemCreator dbc转arxml

SystemCreator dbc转arxml 1. SystemCreator 意义2. SystemCreator使用方法2.1 实现步骤2.2 参考官方文档方法1. SystemCreator 意义 EB Tresos 对dbc直接导入的支持不是很完善,dbc也不是AUTOSAR标准的数据库文件,EB建议所有通信矩阵通过ARXML交互比较合理(AUTOSAR定义的)…

idea中或pycharm中编写Markdown文件

参考 ltjt_aiseek: seek_backend_py 项目 数智科技ai探索API接口开发 1. 安装 Django 框架 在开始创建 Django 项目之前&#xff0c;需要先安装 Django 框架。可以通过 PyCharm 的终端或者系统的命令行工具来完成安装。 使用 PyCharm 终端安装 打开 PyCharm&#xff0c;如果…

J-LangChain - RAG - PDF问答

系列文章索引 J-LangChain 入门 在现代自然语言处理&#xff08;NLP&#xff09;中&#xff0c;基于文档内容的问答系统变得愈发重要&#xff0c;尤其是当我们需要从大量文档中提取信息时。通过结合文档检索和生成模型&#xff08;如RAG&#xff0c;Retrieval-Augmented Gener…

excel单、双字节字符转换函数(中英文输入法符号转换)

在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节&#xff0c;ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入&#xff0c;如英文字母&#xff0c;英文输入法…

MySQL的锁机制和锁算法

锁机制和InnoDB锁算法 MyISAM和InnoDB存储引擎使用的锁&#xff1a; MyISAM采用表级锁(table-level locking)。 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 表级锁和行级锁对比&#xff1a; 表级锁&#xff1a; MySQL中锁定 粒度最大 的一种锁&#xff0c;…

【cuda学习日记】4.4核函数带宽(矩阵转置问题)

4.4.1 内存带宽 理论带宽是当前硬件可以实现的绝对最大带宽。在cuda中获取 int dev 0;cudaSetDevice(dev);cudaDeviceProp deviceprop;CHECK(cudaGetDeviceProperties(&deviceprop,dev));printf("device %d: %s \n", dev, deviceprop.name);printf("Peak …

Java | 基于Kerberos认证对接华为云Elasticsearch

可以通过华为官方提供的Java客户端&#xff0c;来实现基于Kerberos认证访问和操作华为云Elasticsearch&#xff1b;亦可以使用更加通用的开源Elasticsearch Java客户端bboss&#xff0c;来实现基于Kerberos认证访问和操作华为云Elasticsearch。 本文介绍使用bboss实现基于Kerb…