每个人都用过 HTTP 协议。在网页端,在 App 端,大部分的数据交换都基于 HTTP 协议,但你也许会听过其他的一些协议。
从 《2023 全球 API 状况报告》 里的数据,我们能看到全球的开发者使用最多的 API 协议:
这些协议有什么不同?为什么要有那么多种协议?这些协议到底要怎么使用?
本文盘点了其中最常用的九大 API 协议/接口规范,它们分别是:
- REST
- GraphQL
- SOAP/Web Service
- WebSocket
- Socket
- SSE
- gRPC
- Dubbo
- MsgPack
REST
REST 其实不是一种协议,REST 接口使用的网络协议是 HTTP。
HTTP 协议非常适合那些采用单向的请求 - 响应模式的应用,比如访问社交媒体上的照片或者新闻文章,但是它并不适合需要双方实时通信的应用,比如在线游戏或视频聊天。
REST 是在开发者使用 HTTP 协议时共同遵守的设计原则,是一种软件架构风格,它并不是一种硬性的技术标准。REST 风格 API 一般长这个样子:
如何调用
浏览器可能是最简单的 REST 接口调用工具。浏览器地址栏就是一个最原始的 GET 请求发起器,它会将 GET 返回的数据展示在网页里。
但是,要实现 POST、PUT、DELETE 等动作就要写代码了。当然,你也可以使用像 Apifox 这样的 API 工具,一键发起各种类型的 HTTP 请求。
GraphQL
在上面的 REST 接口里,我们需要预先定义好各种具体的操作的接口(获取所有用户,获取特定用户,按标签查询用户等),就像饭店里固定搭配的套餐。
而 GraphQL 是一种灵活的数据查询语言,让你可以像点餐一样精确地获取你需要的数据,好比你在餐馆里直接告诉服务员想要哪些食物,以及烹饪方式,而不是被迫点一份固定的套餐。
GraphQL 适用于那些需要大量互动、实时数据或者多层次数据的应用。比如社交媒体的实时消息更新、即时通讯或者数据可视化工具。它能够满足不同应用的各种需求,因为你可以在一个请求中包含多个查询,从而减少了网络请求的数量。
如何调用
当使用 GraphQL 进行数据调用时,你会构建一个查询(Query)来获取你需要的数据。这个查询看起来类似于一个 JSON 对象,你可以指定所需的字段和参数。以下是一个简单的 GraphQL 查询示例,假设我们要获取一个博客应用中的文章信息:
在这个查询中:
- query 表示这是一个查询操作。
- article(id: 123) 表示我们想要获取一篇文章,其中 id 参数为 123。
- 在大括号 {} 内,我们指定了想要获取的字段,如 title、content 和 author。
- 在 author 字段下,我们还指定了作者的信息字段,包括 name 和 email。
当发送这个查询到 GraphQL 服务器时,服务器会返回一个 JSON 响应,包含与查询匹配的数据。好比构建一个查询,指定你需要的数据字段,然后向服务器发送查询,并接收服务器返回的 JSON 响应以获取所需的数据。响应可能如下所示:
这个响应包含了我们所请求的文章的标题、内容以及作者的信息。所有数据都以嵌套的方式返回,与查询的结构一致。这种方式允许客户端精确地获取所需的数据,而不会浪费带宽和资源。
在 Apifox 中,可以直接使用 HTTP POST 方式发起 GraphQL API 请求。你只需要将 Body 类型指定为 GraphQL,将请求 JSON 写入 Query 即可。
你可以在 Query 中使用变量,将变量值写入 Variables 框,就可以更加便利地调用固定格式的 GraphQL 请求。
SOAP / Web Service
SOAP(Simple Object Access Protocol,简单对象访问协议)是一种跟 REST 类似,但更古早一点的协议。它跟 REST 的最大的差异是使用 XML 方式作为 body 来传递信息。它提供了强大的功能,包括安全性、事务性操作和可扩展性,但也因其 XML 格式相对冗长而被一些新的通信协议所取代。
Web Service 是一个比较古早的名词,现在一般指使用 SOAP 协议的接口服务。
如何调用
要使用 SOAP/Web Service,你需要定义一个 SOAP 消息的格式,通常使用 XML 来表示消息的结构和内容。消息由一个 envelope(信封)包裹起来,其中包含了 header(头部)和 body(主体)部分。header 可用于包含一些元数据和安全信息,而 body 包含实际的数据。
在 Apifox 中调试 SOAP 接口时,只需要根据接口实际情况,手动设置 Header 的 Content-Type 的值为 text/xml; charset=utf-8 或 application/soap+xml,然后设置 Body 格式为 xml,点击「发送」,即可收到 SOAP 接口返回的 XML 格式的数据。
WebSocket
无论是 REST、GraphQL 还是 SOAP,都是一问一答式的通信。但有时我们需要更高频的数据交换,比如实时聊天,这时候就需要一种新的协议来解决了。
WebSocket 是一种特殊的通信协议,它与传统的 HTTP 协议不同,它更像是一条电话线,允许服务器和客户端之间进行实时、双向的对话。就像是你在打电话,而不只是发短信。
WebSocket 适合处理需要实时性和双向通信的应用,比如在线聊天、多人协作编辑、在线游戏或者实时股票市场数据更新。它能够让服务器主动向客户端发送消息,而不必等待客户端的请求。这种特性对于那些需要即时响应的应用非常重要。
与 HTTP 不同,WebSocket 不是一次性的请求-响应模式。它通过建立一个持久连接,双方可以随时发送消息。这就像是你与朋友进行实时对话,而不是发电子邮件等待回复。
如何调用
在 Apifox 中,你可以输入服务器 URL,点击「连接」,一个 Websocket 长连接就建立起来了。
接下来,你可以通过发送 JSON 数据的方式跟服务器通信,也可以实时接收到服务器下发的数据,实现双向实时数据传输。你可以在左下角的时间线视图里方便地查看所有通信记录。
Apifox 还支持直接生成 Websocket 协议的 API 文档。你可以点击查看更多使用技巧:《Apifox WebSocket 调试功能你会用了吗?》
Socket
Socket 协议是一个非常古早的通信模型,使用 TCP 作为网络通信协议,允许不同程序/计算机之间通过网络传输数据。Socket 通信也是一种实时、双向的通信方式,客户端和服务器之间建立持久连接后,双方可以随时发送和接收数据。
不过与 WebSocket 有所区别的是,Socket 提供了底层的网络编程接口,允许开发者完全控制数据传输过程。并且采用 TCP 协议使得 Socket 用于更广的场景,包括实时通信、文件传输、远程控制等。
如何调用
进入 Apifox 项目后,点击左侧搜索框旁边的 + 号按钮,轻点「新建 Socket 服务」选项。
创建了 Socket 服务之后,可以继续添加在 Socket 服务之下的接口。Apifox 支持自定义接口请求和响应的数据处理函数,方便进行各种灵活的调试。
SSE
当我们在使用 ChatGPT 聊天的时候,你会发现文字是一个一个蹦出来的,这跟微信聊天又有所不同。
ChatGPT 使用的是 SSE(Server-Sent Events)技术,全称是服务器推送事件,它是一种基于 HTTP 协议的实时通信技术。用于在客户端和服务器之间建立持久、单向的链接。虽然和 WebSocket 类似都具备实时连接功能,但 WS 是支持双向连接的,而 SSE 是单向的,只支持服务端向客户端发送异步消息,使得它对带宽资源消耗较小。
也就是说,WebSocket 是两个人互相打电话,而 SSE 是客户端发短信,服务端讲电话。
如何调用
使用 Apifox 调试 SSE 接口时,仅需要像调试普通的 HTTP 接口一样新建接口。
当接口的返回数据的 Content-Type 包含 text/event-stream 参数时,Apifox 会自动将返回的数据解析为 SSE 事件,并以全新的时间线视图实时更新响应内容。
gRPC
前面的各种协议,大都适用于前端和后端的通信。而 gRPC(gRPC Remote Procedure Call,远程过程调用)不同,它更多地是用于后端和后端之间的通信。
在大型企业中,往往使用微服务架构,不同的服务由不同的系统实现。比如订单服务、商品服务、用户信息服务部署在不同的服务器上,这些系统可能使用了各自不同的技术。
gRPC 适合用于构建分布式系统中的微服务架构,尤其是需要高性能、低延迟和跨语言通信的情况。与传统的 HTTP 或 REST API 相比,gRPC 更加轻量级且高效,它使用 Protocol Buffers(ProtoBuf)作为数据序列化格式,这使得数据传输更加紧凑和快速。
一个典型的 gRPC 场景包括多个微服务之间的通信,例如用户服务需要从订单服务获取信息。gRPC 允许你定义服务接口和方法,并生成客户端和服务器端的代码,使得开发过程更加简化。这就像是国际邮件服务,你只需知道如何填写地址和标明信件的内容,剩下的工作由邮递员和邮局来完成。
在企业中,后端往往会使用 gRPC 来调用企业内部不同系统之间的服务,而使用 REST API 来对前端提供服务。
如何调用
你只需要先在 Apifox 中创建 gRPC 项目即可开始调试:
Apifox 支持以下 4 种类型方法调用 gRPC 接口:
- Unary:一元调用
- Server Streaming:服务端流
- Client Streaming:客户端流
- Bidirectional Streaming:双向流
相较于市面上的其它 gRPC 调试软件,Apifox 为 gRPC 流式调用提供了一个时间线视图,按照时间顺序集中展示调用状态、发送和收到的消息。
Dubbo
Dubbo 框架是由阿里巴巴开发的一款分布式服务框架,Dubbo 协议是该框架中的一部分,用于微服务之间的通信。
Dubbo 协议的使用场景跟 gRPC 是类似的,主要用于后端之间的通信。两者都是强大的分布式通信框架,选择哪一个取决于你的具体需求和技术栈。如果你在 Java 生态系统中工作,并需要稳定性和可用性,Dubbo 可能是更好的选择。如果你需要跨语言支持、强类型定义和高性能的通信,gRPC 可能更适合你。
Dubbo 协议采用了二进制序列化和网络传输方式,相比 REST API 采用文本模式传输数据,二进制格式数据传输模式可以提供更高的效能和花费更小的开销,非常适合内网环境。
因此 Dubbo 协议尤其擅长处理大规模微服务架构中的服务调用和治理问题,支持多种主流网络传输协议和多种序列化格式,在国内的后端开发者当中十分流行。
如何调用
Apifox 支持管理与调试 Dubbo 项目,目前支持 ZooKeeper、Nacos、阿里云 EDAS 三种外部导入渠道。
导入接口后,点击右上角的「调用」按钮,即可得到接口的返回结果。
MsgPack
MsgPack(MessagePack)也不是协议。它是一种将数据序列化成紧凑的二进制格式的开放标准。它就像是将数据压缩成小巧的包裹,以便于在不同系统之间更快地传输和存储。 MsgPack 适合用于需要高效传输数据的场景,尤其对网络流量敏感的移动 APP 中。与 JSON 等文本格式相比,MsgPack 的二进制格式更加紧凑,节省了更多带宽和存储空间。
一些典型的使用场景包括:
- 分布式系统通信:MsgPack 可用于在不同的服务之间传输数据,减少网络负载,提高通信效率。
- 高性能应用:对于需要快速序列化和反序列化数据的应用,MsgPack 提供了比文本格式更快的速度。
- 数据存储:MsgPack 可以用于将数据紧凑地存储在文件或数据库中,节省存储空间。
- 嵌入式系统:MsgPack 适用于资源有限的嵌入式系统,因为它的解析相对轻量。
MsgPack 有多种语言的实现,因此可以轻松地在不同编程语言之间进行数据交换。它还支持多种数据类型,包括数字、字符串、数组、映射和自定义类型,使得它非常灵活。
如何调用
在 Apifox 中,可以直接使用 HTTP POST 方式发起 MsgPack 请求,只需要将 Body 类型选择为 MsgPack,将请求 JSON 写入 Query 即可。
以上列出了九种常用的 API 协议/接口规范,Apifox 现已全部支持。
Apifox 作为先进的 API 设计/开发/测试工具,不断兼容市面上流行的 API 协议,让开发人员不必再为某个 API 协议而苦苦寻找接口调试工具。
Apifox = Postman + Swagger + Mock + JMeter
一个工具就可以解决 API 开发 → 调试 → 管理问题,让更多中国开发团队也能够体验到一流的一站式 API 管理方案。