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
message3
5. 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:
请求:
http
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 本身只定义:
"消息格式"
例如:
请求:
json
{
"jsonrpc":"2.0",
"method":"add",
"params":[1,2],
"id":1
}
返回:
json
{
"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 等现代应用。