API协议全景解析:从REST到大模型Streamable HTTP的演进与选型指南

文章深入解析REST、GraphQL、RPC、WebSocket、SSE和MCP等六大API协议,提供从传统Web到AI时代的选型指南,助力开发者高效构建应用。

原文标题:API协议全景图:从REST到MCP的选型指南

原文作者:阿里云开发者

冷月清谈:

文章以开源项目HiMarket为背景,系统梳理了从传统Web到现代AI场景下的六种主流API协议,旨在帮助开发者理解不同协议的核心定位、技术特点与适用场景。API作为连接不同软件系统、实现数据交互的桥梁,其核心能力在于定义规则、解耦系统、提升复用性。

**首先是应用广泛的RESTful API**,基于HTTP协议,以资源为核心,通过URL和HTTP方法操作资源,具备直观易懂、无状态、标准化和跨语言等优势,是Web API的事实标准。然而,当客户端数据需求精细化时,RESTful可能存在数据获取过多或不足的问题。

为解决此问题,**GraphQL应运而生**,它允许客户端“按需取数”,通过单一入口和查询语句精确指定所需数据结构,避免了不必要的带宽浪费和解析开销。其强类型Schema和自文档化特性也使其对前端更加友好。GraphQL通过单一入口和客户端自定义查询,实现了按需取数,解决了RESTful的数据获取低效问题。

接着是**面向微服务体系的高性能API**,如阿里开源的Dubbo、Google的gRPC和Spring Cloud的Feign。它们主要用于服务间高频调用,通过多协议支持(如gRPC的HTTP/2+Protobuf二进制格式)和RPC范式,提供比RESTful更低的延迟和更高的效率。

**WebSocket则专注于实时通信场景**,它提供全双工、双向、实时的TCP长连接,适用于即时通讯、协同办公等需要服务端主动推送消息的场景,打破了HTTP的单向请求-响应模式。

针对大模型输出渐进式、响应延迟长且单向为主的特点,出现了**流式API:SSE**(Server-Sent Events)。SSE基于HTTP,服务端可向客户端单向推送事件流,轻量级且兼容现有HTTP基础设施。SSE和Streamable HTTP为大模型场景提供了高效的单向流式传输方案。

最后是**面向MCP(Model Connection Protocol)场景的Streamable HTTP**。它是在早期HTTP+SSE基础上改进而来,统一了端点,实现了按需流式传输和状态管理,大幅提升了稳定性和性能,尤其解决了长连接维护、复杂性和兼容性问题,是AI开放平台的核心协议之一。

API的演进史是软件工程不断适应新需求的过程,每种新形态都在性能、灵活性、实时性之间寻求新的平衡点。

怜星夜思:

1、文章介绍了这么多API协议,作为开发者,实际项目中该如何选择?有没有一个“万能”的判断标准或者说一些关键的决策因素?
2、随着AI和边缘计算的快速发展,未来API协议会朝什么方向演进?文中提到的Streamable HTTP会不会成为新一代主流?
3、既然有这么多协议,一个大型复杂系统里,是倾向于统一使用一种协议,还是不同服务根据场景使用不同协议更合理?如果混用,会不会增加维护复杂性?

原文内容

阿里妹导读


本文以开源项目 HiMarket 为背景,系统梳理了从传统Web应用到现代AI场景下的六种主流API协议,帮助开发者厘清不同协议的核心定位、技术特点与适用场景。

笔者近期参与了一个开源项目的建设:HiMarket。这个开源项目旨在帮助开发者,尤其是企业快速实现私有的 AI 开放平台,专注在对外提供 API 和 MCP 服务的管理上。因此,借此机会对主流 API 协议的功能和应用场景进行了梳理,以厘清容易混淆的概念。

API(Application Programming Interface,应用程序编程接口),顾名思义,是用来连接不同软件系统,以实现数据交互和服务共享的作用。构成上,它是一组规定或协议,定义了不同应用或组件之间,相互交互的方法。用三个关键词来定义 API 的核心能力,就是:定义规则、解耦系统、提升复用性

广义上,我们也可以把 API 视为一种中间件,允许开发者访问和使用某些功能或数据,而无需了解背后的详细实现,从而降低软件系统的复杂度。例如,阿里云提供的 OpenAPI,就是提供给开发者的一系列应用程序编程接口,帮助开发者可以通过 API 的方式,来管理云上的资源、数据和服务等。

随着软件形态和应用场景的丰富,API 的种类也在不断被丰富。从最早的重量级 SOAP,到 Web 世界流行的 RESTful API,再到大模型语境下的流式 API,每一种新类型的出现都对应了新型软件形态下的不同工程解法。本文旨在对主流的 API 定位、功能、应用场景进行梳理,帮助开发者对 API 协议有一个全貌了解。

不同的视角,会有不同的分类方式。本文从应用场景,对 API 作了6种分类。

一、应用广泛的 RESTful API

REST(Representational State Transfer)是当下最广泛使用的架构风格,它基于 HTTP 协议,定义了一组设计约束和理念,他的核心思想是:一切都是资源(Resource),通过统一的接口来操作这些资源。并用 URL 来表示资源,用 HTTP 方法(GET/POST/PUT/DELETE)来定义操作。基于 REST 来构建的 API,我们称之为 RESTful API。

在 Web 世界里,资源通常对应一个 URL。例如:

  • https://api.example.com/users/123 → 代表一个用户资源
  • https://api.example.com/orders/456/items → 代表订单里的商品资源

这就像物理世界里,每一个门牌号都能唯一指向一间房子。最常见的开放平台,例如微信、支付宝、高德等开放平台,对外提供的 API 服务就是 RESTful 的。

优势

  • 直观易懂:URL 就是资源,HTTP 方法就是操作,GET/POST/PUT/DELETE 的语义清晰。
  • 无状态性:每个请求都独立携带上下文,服务端不用记住客户端的状态,这使得扩展性更好。
  • 标准化:基于 HTTP 协议,充分复用现有的基础设施(缓存、代理、负载均衡等)。
  • 跨语言:JSON/XML 等文本格式,使得不同语言都能轻松解析。

如何工作

一次典型的 REST 调用,分成客户端请求和服务端响应两个部分:

客户端请求包含什么
  • URL:标识资源,例如 /users/123
  • HTTP 方法:定义操作,例如 GET 查询、PUT 更新
  • Headers:附加信息,比如内容格式(Content-Type: application/json)、认证令牌(Authorization: Bearer ...
  • 请求体(Body):对于 POST/PUT 请求,通常包含 JSON 数据

请求示例:

POST /users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer <token>

{
  “name”: “望宸”,
  “role”: “engineer”
}

服务端响应包含什么
  • 状态码告知结果,例如 200 OK201 Created404 Not Found
  • Headers响应的元数据,例如缓存策略、返回数据格式
  • 响应体(Body)通常是 JSON,携带资源内容

响应示例:

HTTP/1.1201 Created
Content-Type: application/json

{
  “id”: 123,
  “name”: “望宸”,
  “role”: “engineer”
}

REST 的设计哲学迎合了互联网应用的爆发需求:轻量、直观、跨语言、易扩展,搭配 Swagger (现称 OpenAPI Specification, OAS)的规范,成为互联网世界应用最广泛的的 API 形态,是 Web API 协议的事实标准。

但随着应用场景的多样化,它也逐渐暴露出一些局限,因此出现了其他的 API 形态。

二、前端查询友好的 GraphQL 

在移动互联网和前端复杂化的背景下,客户端需要的数据结构和后端返回的 RESTful 响应会出现对不上号的情况。

  • 数据获取过多:例如客户端只需要用户的头像和昵称,但 RESTful API /users/123 返回了整个用户对象(包含地址、订单、权限等一大堆信息)。这不仅浪费带宽,还增加了解析开销。
  • 数据获取不足:例如移动端要展示用户信息 + 最近三条订单,但 RESTful 只能先调 /users/123,再调 /users/123/orders,最后还得筛选。一个页面可能要发出三四次请求,性能和延迟都受到影响。

这种不足在移动端、复杂单页应用、跨端应用尤为严重,因为客户端和网络环境资源有限。GraphQL 正是为了解决这个问题而出现的。它允许客户端“按需取数”,一次请求返回所需字段。

GraphQL 是 Facebook 在 2015 年开源的一种 API 查询语言与执行引擎。它的核心理念是:客户端自己决定要什么数据,服务端只返回所需字段。

和 RESTful 按资源划分不同,GraphQL 只有一个统一的入口(通常是 /graphql),客户端通过查询语句(Query)来精确指定数据结构。打个比方来解释 GraphQL 和 RESTful 的不同:

  • RESTful 是优惠套餐,点了“用户信息”,结果上了一桌子菜,包含了你不需要的;
  • GraphQL 是自助区,用户拿个盘子,自己挑头像、昵称、最近三单,拿多少算多少。

优势

  • 按需取数:避免 RESTful 的过度获取和获取不足。
  • 单一入口:所有请求都通过 /graphql,简化路由和维护。
  • 强类型 Schema:客户端和服务端共享同一份类型系统,减少数据格式不一致的问题。
  • 自文档化:Schema 定义就是文档,开发者可以通过 introspection 自动获取接口描述。
  • 前端友好:前端团队可以独立定义所需数据,减少和后端的沟通成本。

工作机制

GraphQL 的运作分三步:

  • 客户端构造查询:用类 JSON 的语法描述需要的数据字段;
  • 服务端解析查询:根据 Schema 验证语法和字段合法性;
  • 服务端执行解析器:从数据库或服务获取数据,并组装成响应。
客户端请求示例
POST /graphql HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  “query”: “{
    user(id: 123) {
      name
      max
      orders(limit: 3) {
        id
        total
      }
    }
  }”
}

服务端响应示例
{
  "data": {
    "user": {
      "name": "望宸",
      "max": "https://cdn.example.com/max/123.png",
      "orders": [
        { "id": "A001", "total": 99.9 },
        { "id": "A002", "total": 58.0 },
        { "id": "A003", "total": 199.5 }
      ]
    }
  }
}

可以看到:客户端只要“头像、昵称、三条订单”,服务端就不会多给一个字节。

三、面向微服务体系的 API

在性能要求不高的情况下,RESTful 足够好用。但进入微服务架构之后,问题变得复杂:

  • 一个前端请求可能要串联 5~10 个微服务,RESTful 的 JSON 编码 + HTTP/1.1 协议在序列化和传输上效率并不高。
  • 服务之间往往是高频调用,这时候带宽和 CPU 序列化开销就成了大问题,需求高性能的调用框架。

这里我们介绍3种大家熟悉的,用于微服务架构的高性能远程调用框架或实现范式。

Apache Dubbo

Apache Dubbo,由阿里开源,是一种 RPC(Remote Procedure Call)框架。核心特性包括:

  • 多协议支持:默认用 Dubbo 协议(基于 TCP/长连接),后来也支持 gRPC、REST 等。
  • 注册中心:典型搭配 Zookeeper、Nacos 来做服务发现。
  • 负载均衡 & 容错:内建多种负载策略、调用重试、限流降级。
  • 面向 Java 生态:和 Spring/Spring Boot 结合紧密。

gRPC

gRPC 作为 RPC 架构的一种变体, 由 Google 于 2015 年创建,相比 RESTful API,具备更高性能、更低延迟的特点。

  • 协议:gRPC 依赖于 HTTP/2,提供更好的性能和更低的延迟,而 REST 使用 HTTP/1.1。
  • 数据格式:gRPC 采用协议缓冲区 Protobuf(一种二进制序列化格式),从而实现更小的有效负载和更快的通信;REST 通常利用 JSON 或 XML(基于文本的格式)。
  • API 设计:gRPC 遵循 RPC 范式,使其感觉像是调用本地函数;REST 遵守表述性状态转移模型的架构约束,专注于资源和状态转换。
  • 流式传输:gRPC 支持双向流式传输,从而实现客户端和服务器之间的持续数据交换;REST 仅限于请求-响应通信模式。

Spring Cloud

在 Spring Cloud 体系里,最初的远程调用主要依赖 REST(基于 HTTP),通过 RestTemplate 或后来推荐的 WebClient,后来出现了 Feign(声明式 HTTP 客户端),开发者用接口 + 注解就能调用远程服务,更贴近 RPC 的开发体验。

打个比喻,RESTful 是公路运输(HTTP + JSON),虽然灵活,但车流量大了容易堵车;RPC 是修好的高铁轨道,列车运行高效、可预测,适合点对点的大规模通信。

四、面向实时通信的 API:WebSocket

实时性是互联网应用中诸多场景的刚需。比如:

  • 即时通讯应用的消息同步
  • 协同办公软件里的文档编辑
  • 游戏场景下的状态更新
  • 交易平台的行情推送

如果仅靠 RESTful API 的请求-响应模型,客户端要么需要不断轮询服务器,要么只能被动等待。前者带来资源浪费,后者无法满足实时性。因此,WebSocket 就应运而生,它们提供了从服务端主动推送消息到客户端的能力,但方式和适用场景有所不同。

WebSocket 是 HTML5 标准中的全双工通信协议,它允许客户端与服务端在单个 TCP 连接上进行双向、实时数据交换。与 REST 不同,WebSocket 不是一次请求&一次响应的短时通信,而是一旦建立连接,就能随时互发消息。

优势

  • 双向通信:客户端和服务端都能主动发消息,打破了 HTTP 单向模式。
  • 低延迟:复用连接,避免了频繁 HTTP 握手的开销。
  • 实时性高:适合消息交互频繁的场景。

工作机制

  • 客户端通过 HTTP 请求发起握手(Upgrade: websocket);
  • 服务端同意升级,建立 WebSocket 连接;
  • 后续通信基于帧协议在 TCP 长连接上传输,支持二进制和文本。

示例

const socket = new WebSocket("ws://example.com/chat");
socket.onopen = () => socket.send("Hello!");
socket.onmessage = (event) => console.log(event.data);

五、面向大模型场景的流式 API:SSE

大模型场景下流量具备如下特点:

  • 生成结果是渐进式的:大模型在推理时,不是一次性生成完整答案,而是逐 token 输出。
  • 响应延迟更长:推理耗时可能是秒级甚至分钟级。
  • 数据量大且不可预估:大模型的输出结果往往难以事先预估字数,一次性传输容易导致内存压力、带宽突增,甚至连接超时。
  • 交互模式以单向为主:大多数大模型应用场景是先用户提问,再模型回答,很少需要实时的双向消息交互。
  • 连接数量庞大,运维要求高:一个大模型应用可能同时服务数百万用户,需求更轻量、更易于代理和负载均衡的方案。

因此,RESTful 不适合,因为其是客户端发出请求,等待服务端计算完毕,再一次性返回结果WebSocket 是双向通信,需要独立的协议升级、长连接管理、心跳检测,复杂网络(防火墙、代理、负载均衡)下,WebSocket 更容易被中断,WebSocket 的双向能力略显冗余,不是最优选择。

SSE(Server-Sent Events)是一种基于 HTTP 的单向流式传输机制,服务端可以不断通过同一连接向客户端推送事件流,天然适合在对话 Agent 的场景。

优势

  • 天然流式:支持服务端边生成边推送,用户能立即看到部分输出。
  • 基于 HTTP:复用已有 HTTP 基础设施,兼容性好,代理/负载均衡/防火墙都友好。
  • 轻量级:只需要服务端不断写入 data: 数据块,客户端就能实时接收。
  • 专注单向流:正好匹配大模型“只需要输出”的场景,不必浪费资源维护双向通道。
  • 断线重连:支持 Last-Event-ID,能从中断点恢复。

工作机制

1. 客户端通过 EventSource 向服务端发起 HTTP GET 请求;
2. 服务端返回 Content-Type: text/event-stream 并保持连接;
3. 服务端以流的形式持续推送事件:
data: hello
data:  world
4. 客户端逐条处理,形成实时效果。

示例

const source = new EventSource("/events");
source.onmessage = (event) => console.log("New data:", event.data);
打个比喻理解三者的不同,WebSocket 是打电话,双方可以随时打断对方说话。SSE 是电台广播,服务端不断播放节目,客户端调频收听。而 RESTful 是写信,必须一来一回。相比 WebSocket 的电话模式,SSE 更轻量,适合单向推送。关于 WebSocket 和 SSE 的选型详情,请阅读

六、面向 MCP 场景的 API

MCP 本质上也是一种 API,作为 MCP Server 向大模型客户端提供应用程序编程接口。早期,MCP 官方采用了 SSE 协议,但是之后变更成 Streamable HTTP 协议。

HTTP + SSE 存在的问题

HTTP+SSE 的传输过程实现中,客户端和服务器通过两个主要渠道进行通信。

  • HTTP 请求/响应:客户端通过标准的 HTTP 请求向服务器发送消息。 
  • 服务器发送事件(SSE):服务器通过专门的 /sse 端点向客户端推送消息。

这就导致存在下面三个问题:

  • 服务器必须维护长连接,在高并发情况下会导致显著的资源消耗。
  • 服务器消息只能通过 SSE 传递,造成了不必要的复杂性和开销。
  • 基础架构兼容性,许多现有的网络基础架构可能无法正确处理长期的 SSE 连接。企业防火墙可能会强制终止超时连接,导致服务不可靠。

Streamable HTTP 的改进

Streamable HTTP 是 MCP 协议的一次重要升级,通过下面的改进解决了原有 HTTP + SSE 传输方式的多个关键问题:

  • 统一端点:移除了专门建立连接的 /sse 端点,将所有通信整合到统一的端点。
  • 按需流式传输:服务器可以灵活选择返回标准 HTTP 响应或通过 SSE 流式返回。
  • 状态管理:引入 session 机制以支持状态管理和恢复。

因此,相比 SSE,Streamable HTTP 在稳定性、性能和客户端复杂度上都有了大幅提升。

七、总结和展望

API 的演进史就是软件工程不断应对新问题的过程。从 SOAP 的繁琐,到 RESTful 的简洁,再到 GraphQL 的灵活,从单向的 HTTP 请求,到实时双向通信的 WebSocket,再到大模型语境下的流式 API,每一次形态的出现,都是在性能、灵活性、实时性之间找到新的平衡点

未来,随着 AI 原生应用的丰富,API 还会继续演进,并会衍生出 API 管理方面更多的诉求。近期,Higress 开源了开箱即用的 AI 开放平台 Himarket,旨在高效、统一管理 RESTful API、MCP 这些对外提供服务、数据、应用的接口,欢迎试用。

HiMarket AI 开放平台:https://github.com/higress-group/himarket

要说有没有“万能”的判断标准,我想大概可以归结为一句话:根据你的“通信需求”来决定。核心决策因素包括:
1. 数据交互模式:是简单的请求-响应(RESTful),还是按需定制数据(GraphQL),或是频繁的双向实时通信(WebSocket),抑或是服务器单向流式推送(SSE/Streamable HTTP)?
2. 性能要求:是否对延迟、吞吐量有极高要求?(RPC类协议通常更优)
3. 开发体验与生态:团队熟悉哪种技术栈?是否有成熟的工具链和社区支持?
4. 基础设施兼容性:现有的网络架构是否支持特定协议(例如防火墙对WebSocket的支持,或HTTP/2的使用)?
所以,本质上就是一场Trade-off,没有银弹,根据项目优先级做取舍。

哈哈,未来API协议?估计就是“更懒、更聪明”吧!“更懒”是说开发者可能不用操心太多协议细节,API自己就能智能适配最优传输方式;“更聪明”是说协议本身能处理更多复杂的网络环境和数据传输场景。Streamable HTTP这种针对大模型的优化,我很看好它在AI领域的普及,毕竟大模型越来越普及,它的输出特点也确实需要专门的协议来解决。但要取代RESTful这种老牌“常青树”,我觉得不太可能,就像高铁再快也取代不了公路运输,只是各自擅长的领域不同。可能大家都会朝着“流式化”和“高效二进制传输”方向发展。

关于“实际项目中该如何选择API协议”,我认为需要综合考量多方面因素。从技术角度看,业务需求(是否需要实时性、数据精确度)、性能指标(延迟、吞吐量)、开发效率(技术栈匹配度、社区支持)、运维复杂度(基础设施兼容性、监控工具)都至关重要。举例来说,对外开放的公共API通常优先选择RESTful,因为它最通用、易懂;内部微服务间对性能要求高、调用频率快的场景,gRPC或Dubbo这类RPC框架能带来显著优势;如果需要前端按需获取复杂数据结构,GraphQL会是好的选择;而涉及即时通讯或协作场景,WebSocket的实时双向通信能力无可替代;最后,针对大模型这种渐进式、单向输出,SSE或文章提到的Streamable HTTP则是专门的优化方案。没有“万能”标准,只有“最适合”的方案,关键是深入理解各协议的优劣,并结合具体业务场景灵活选择。

对于一个“大型复杂系统”,我的观点是:根据场景使用不同协议是更合理且更高效的方式。强制统一使用一种协议,往往会导致在不匹配的场景下性能低下或开发受限。例如,对外提供给广泛第三方的API,RESTful是最佳选择,因为它理解成本低、兼容性好;而内部微服务之间,若对性能有极致要求,选择gRPC这类高性能RPC显然更优。核心是“合适即最好”。当然,“混用会不会增加维护复杂性”是一个完全正当的顾虑,这时就需要强大的API网关层来扮演“协议翻译官”和统一管理者的角色,同时明确的文档、Code Review和自动化测试也是降低复杂性的关键。

“未来API协议会朝什么方向演进?” 我觉得会是“分化与融合”并存。分化是指更多针对特定高需求场景(如AI、物联网、AR/VR)的优化协议会涌现,Streamable HTTP就是很好的例子,其解决了大模型输出的特殊性。而融合则体现在各协议会互相借鉴优点,比如RESTful逐渐支持部分流式传输,或者RPC框架更好地融入HTTP/3等最新传输技术。Streamable HTTP在大模型领域很有潜力成为“新一代主流”,因为它解决了特定痛点。但在广义的Web API领域,RESTful和GraphQL的地位短期内依然稳固,毕竟它们有易用性、生态成熟等优势。

一个字:混用!两个字:必须混用!谁家大型系统能只用一种协议啊?那不成了“削足适履”了嘛!比如,我们对外接广告平台用RESTful,因为大家都这么干;公司内部做个实时数据分析,那肯定得上WebSocket或者gRPC,效率是王道;最近我们大模型项目,就专门用了类似Streamable HTTP的方案。你问“会不会增加维护复杂性”?废话,肯定会啊!但这就要靠好的分层设计、完善的文档和自动化工具来弥补了。不能因为怕复杂就不做最优选择,不然到时候性能瓶颈来了,复杂度更高。

关于“未来API协议的演进方向”,我认为会更加趋向于“场景化定制”和“智能化适配”。AI和边缘计算的特点是数据量大、实时性要求高、分布式部署,这些都要求API协议在传输效率、连接管理、容错能力上有更优的表现。Streamable HTTP无疑是针对大模型这类特定AI场景的优秀探索,它解决了HTTP+SSE在长连接和兼容性上的痛点,很有可能在LLM服务领域成为主流。但要说它是“新一代主流”,可能更准确的说法是成为AI原生应用领域的主流。其他垂直领域,比如物联网边缘设备间的通信,可能会出现更轻量、更注重能源效率的协议。未来API网关也可能发展出更智能的协议转换和优化能力。

“万能”的判断标准?那可能就是“别给自己挖坑”吧哈哈!其实很简单,你就看你最“痛”的是什么地方。比如说,你老是被前端抱怨数据太多了,或者一个页面要调好几次接口,那可能就是GraphQL的用武之地。如果你服务之间互相调用卡得要死,那肯定是往gRPC或者Dubbo这种RPC方向靠。如果你需要做个聊天室或者在线文档协作,那WebSocket是没跑的。至于大模型嘛,文章里也说了,边生成边推送的需求,SSE或者Streamable HTTP就是专门干这个的。总而言之,需求是第一位的,先解决主要矛盾,再考虑优化其他。