链载Ai

标题: API协议全景图:从REST到MCP的选型指南 [打印本页]

作者: 链载Ai    时间: 昨天 22:20
标题: API协议全景图:从REST到MCP的选型指南

笔者近期参与了一个开源项目的建设: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。例如:

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

优势

如何工作

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

客户端请求包含什么

请求示例:

POST /users HTTP/1.1Host: api.example.comContent-Type: application/jsonAuthorization: Bearer <token>
{"name":"望宸","role":"engineer"}

服务端响应包含什么

响应示例:

HTTP/1.1201CreatedContent-Type: application/json
{ "id":123,"name":"望宸","role":"engineer"}

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

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

二、前端查询友好的 GraphQL

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

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

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

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

优势

工作机制

GraphQL 的运作分三步:

客户端请求示例

POST /graphql HTTP/1.1Host: api.example.comContent-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 足够好用。但进入微服务架构之后,问题变得复杂:

这里我们介绍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 不是一次请求&一次响应的短时通信,而是一旦建立连接,就能随时互发消息。

优势

工作机制

示例

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 的场景。

优势

工作机制

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

示例

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