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

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 等现代应用。

相关推荐
爱和冰阔落6 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
say_fall8 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
我不会插花弄玉20 小时前
6.传输层协议UDP【由浅入深-网络】
网络·网络协议·udp
火云代理21 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
xbzb1 天前
容器 IP 每次重建都变?docker network 五种模式与自定义网桥固定地址
网络·docker·容器·ip·network·固定
火云代理1 天前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖1 天前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
火云代理1 天前
Python 使用代理 IP 前,先弄清 Requests 的配置来源与验证方法
网络·python·网络协议·tcp/ip·ip
如夏倾城1 天前
QUIC——HTTP/3 的唯一底层传输协议 及 0-RTT恢复
网络·网络协议·tcp/ip·安全·http
科研邪修法1 天前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络