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