笔者近期参与了一个开源项目的建设: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 的。
优势
如何工作
一次典型的 REST 调用,分成客户端请求和服务端响应两个部分:
/users/123GET查询、PUT更新Content-Type: application/json)、认证令牌(Authorization: Bearer ...)POST/PUT请求,通常包含 JSON 数据请求示例:
POST /users HTTP/1.1Host: api.example.comContent-Type: application/jsonAuthorization: Bearer <token>{"name":"望宸","role":"engineer"}
200 OK、201 Created、404 Not Found响应示例:
HTTP/1.1201CreatedContent-Type: application/json{"id":123,"name":"望宸","role":"engineer"}
REST 的设计哲学迎合了互联网应用的爆发需求:轻量、直观、跨语言、易扩展,搭配 Swagger (现称 OpenAPI Specification, OAS)的规范,成为互联网世界应用最广泛的的 API 形态,是 Web API 协议的事实标准。
但随着应用场景的多样化,它也逐渐暴露出一些局限,因此出现了其他的 API 形态。
二、前端查询友好的 GraphQL
在移动互联网和前端复杂化的背景下,客户端需要的数据结构和后端返回的 RESTful 响应会出现对不上号的情况。
/users/123返回了整个用户对象(包含地址、订单、权限等一大堆信息)。这不仅浪费带宽,还增加了解析开销。/users/123,再调/users/123/orders,最后还得筛选。一个页面可能要发出三四次请求,性能和延迟都受到影响。这种不足在移动端、复杂单页应用、跨端应用尤为严重,因为客户端和网络环境资源有限。GraphQL 正是为了解决这个问题而出现的。它允许客户端“按需取数”,一次请求返回所需字段。
GraphQL 是 Facebook 在 2015 年开源的一种 API 查询语言与执行引擎。它的核心理念是:客户端自己决定要什么数据,服务端只返回所需字段。
和 RESTful 按资源划分不同,GraphQL 只有一个统一的入口(通常是/graphql),客户端通过查询语句(Query)来精确指定数据结构。打个比方来解释 GraphQL 和 RESTful 的不同:
优势
/graphql,简化路由和维护。工作机制
GraphQL 的运作分三步:
POST /graphql HTTP/1.1Host: api.example.comContent-Type: application/json{"query":"{user(id: 123) {namemaxorders(limit: 3) {idtotal}}}"}
{"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 足够好用。但进入微服务架构之后,问题变得复杂:
这里我们介绍3种大家熟悉的,用于微服务架构的高性能远程调用框架或实现范式。
Apache Dubbo
Apache Dubbo,由阿里开源,是一种 RPC(Remote Procedure Call)框架。核心特性包括:
gRPC
gRPC 作为 RPC 架构的一种变体, 由 Google 于 2015 年创建,相比 RESTful API,具备更高性能、更低延迟的特点。
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 不是一次请求&一次响应的短时通信,而是一旦建立连接,就能随时互发消息。
优势
工作机制
Upgrade: websocket);示例
constsocket=newWebSocket("ws://example.com/chat");socket.onopen=()=>socket.send("Hello!");socket.onmessage=(event)=>console.log(event.data);五、面向大模型场景的流式 API:SSE
大模型场景下流量具备如下特点:
因此,RESTful 不适合,因为其是客户端发出请求,等待服务端计算完毕,再一次性返回结果WebSocket 是双向通信,需要独立的协议升级、长连接管理、心跳检测,复杂网络(防火墙、代理、负载均衡)下,WebSocket 更容易被中断,WebSocket 的双向能力略显冗余,不是最优选择。
SSE(Server-Sent Events)是一种基于 HTTP 的单向流式传输机制,服务端可以不断通过同一连接向客户端推送事件流,天然适合在对话 Agent 的场景。
优势
data:数据块,客户端就能实时接收。Last-Event-ID,能从中断点恢复。工作机制
EventSource向服务端发起 HTTP GET 请求;Content-Type: text/event-stream并保持连接;data:hellodata:world
示例
constsource=newEventSource("/events");source.onmessage=(event)=>console.log("Newdata:",event.data);打个比喻理解三者的不同,WebSocket是打电话,双方可以随时打断对方说话。SSE是电台广播,服务端不断播放节目,客户端调频收听。而RESTful是写信,必须一来一回。相比WebSocket的电话模式,SSE更轻量,适合单向推送。关于WebSocket和SSE的选型详情,请阅读《大模型推理主战场:什么才是通信协议标配?》。
六、面向 MCP 场景的 API
MCP 本质上也是一种 API,作为 MCP Server 向大模型客户端提供应用程序编程接口。早期,MCP 官方采用了 SSE 协议,但是之后变更成 Streamable HTTP 协议。
HTTP + SSE 存在的问题
HTTP+SSE 的传输过程实现中,客户端和服务器通过两个主要渠道进行通信。
这就导致存在下面三个问题:
Streamable HTTP 的改进
Streamable HTTP 是 MCP 协议的一次重要升级,通过下面的改进解决了原有 HTTP + SSE 传输方式的多个关键问题:
因此,相比 SSE,Streamable HTTP 在稳定性、性能和客户端复杂度上都有了大幅提升。
七、总结和展望
API 的演进史就是软件工程不断应对新问题的过程。从 SOAP 的繁琐,到 RESTful 的简洁,再到 GraphQL 的灵活,从单向的 HTTP 请求,到实时双向通信的 WebSocket,再到大模型语境下的流式 API,每一次形态的出现,都是在性能、灵活性、实时性之间找到新的平衡点。
未来,随着 AI 原生应用的丰富,API 还会继续演进,并会衍生出 API 管理方面更多的诉求。近期,Higress 开源了开箱即用的 AI 开放平台 Himarket,旨在高效、统一管理RESTful API、MCP 这些对外提供服务、数据、应用的接口,欢迎试用。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |