Streamable HTTP
Streamable HTTP是一种基于 HTTP 的流式传输机制,它允许客户端和服务器之间通过 HTTP 连接持续交换数据,而不是像传统 HTTP 请求那样“一问一答”。它最常出现在现代 AI Agent、实时 API、消息推送等场景中。
简单理解:
普通 HTTP:客户端发一个请求,服务器返回一个完整响应。
Streamable HTTP:客户端发一个请求,服务器可以边生成边返回数据,客户端也可以持续发送或接收数据。
1. 传统 HTTP 是什么样?
例如:
客户端:
GET /user/100服务器:
HTTP/1.1 200 OK { "id":100, "name":"Tom" }流程:
Client ---- request ----> Server Client <--- response ---- Server请求结束,连接通常结束。
2. Streamable HTTP 是什么样?
例如 AI 对话:
你问:
请写一个Java程序服务器生成答案可能需要 10 秒。
传统 HTTP:
请求 | | 等待10秒 | 返回完整答案用户体验:
[等待........] [完整文字一次出现]Streamable HTTP:
请求 | 服务器开始生成 | 返回: "public class" | 返回: " HelloWorld {" | 返回: " public static void main" | 返回: "}"类似 ChatGPT 输出文字:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello"); } }是一点一点出现的。
3. Streamable HTTP 和普通 HTTP 的区别
| 传统HTTP | Streamable HTTP | |
|---|---|---|
| 响应方式 | 一次性返回 | 持续返回 |
| 数据大小 | 适合小数据 | 适合大量数据 |
| 延迟 | 高 | 低 |
| 连接 | 短连接为主 | 长连接 |
| 服务器主动推送 | 困难 | 容易 |
| 典型场景 | 网页API | AI、实时数据 |
4. Streamable HTTP 常见实现方式
方式1:Chunked Transfer Encoding
HTTP/1.1 支持:
Transfer-Encoding: chunked服务器:
HTTP/1.1 200 OK Transfer-Encoding: chunked 5 hello 6 world数据分块发送。
方式2:SSE(Server-Sent Events)
现在很多 AI API 使用:
Content-Type: text/event-stream服务器:
data: Hello data: world data: !特点:
- 单向
- Server → Client
- 基于 HTTP
- 浏览器支持很好
例如:
浏览器 | | HTTP Request | 服务器 | | data: token1 | data: token2 | data: token3方式3:HTTP Streaming
服务器保持连接:
Client | | GET /stream | Server 持续发送: message1 message2 message35. Streamable HTTP 和 WebSocket 的区别
很多人会疑惑:
“那它和 WebSocket 有什么区别?”
确实很像。
WebSocket
建立:
HTTP Upgrade HTTP | | upgrade ↓ WebSocket之后:
Client <===========> Server 双向实时通信双方都可以随时发送。
例如:
- 聊天软件
- 游戏
- 股票行情
Streamable HTTP
还是 HTTP:
Client | | HTTP Request | Server | | Streaming Response | Client主要特点:
- 兼容 HTTP 基础设施
- 更容易穿过防火墙
- 更适合 API
简单比较:
| Streamable HTTP | WebSocket | |
|---|---|---|
| 协议 | HTTP | WebSocket |
| 方向 | 通常服务器流式返回 | 双向 |
| 复杂度 | 低 | 高 |
| 浏览器支持 | 很好 | 很好 |
| 代理兼容 | 好 | 稍差 |
| 实时性 | 较好 | 最好 |
6. 在 AI 场景中的应用
现在大模型 API 大量使用 Streamable HTTP。
比如:
OpenAI API:
请求:
POST /v1/chat/completions { "stream": true, "messages":[ { "role":"user", "content":"介绍一下Java" } ] }服务器返回:
data: { "delta":"Java" } data: { "delta":"是一种" } data: { "delta":"编程语言" }客户端不断接收。
7. 与JSON-RPC 2.0 有什么关系?
这个联系很有意思。
JSON-RPC 2.0 本身只定义:
“消息格式”
例如:
请求:
{"jsonrpc":"2.0","method":"add","params":[1,2],"id":1}返回:
{"jsonrpc":"2.0","result":3,"id":1}但是:
JSON-RPC 不规定传输协议。
所以它可以运行在:
JSON-RPC | +--- HTTP | +--- WebSocket | +--- Streamable HTTP | +--- TCP例如:
MCP(Model Context Protocol) | | JSON-RPC 2.0 | | Streamable HTTP很多 AI Agent 架构就是这样:
AI Client | | JSON-RPC messages | | Streamable HTTP | ↓ AI Tool Server总结一句:
Streamable HTTP = 在 HTTP 上实现持续数据流传输的一种方式。它让服务器可以边产生数据边发送,而不用等待整个结果生成完。它常用于 AI 大模型流式输出、实时通知、日志流、MCP 等现代应用。
