首先我们来讲讲什么是 REST 吧~
REST(REpresentational State Transfer 的缩写)是一种架构风格,旨在帮助创建和组织分布式系统。这一切都始于 2000 年的 Fielding,他致力于开发一种独特的客户端-服务器通信标准化方法。
REST 使用 HTTP 协议进行通信,它被广泛用于 Web 应用程序中。REST 只是为高层架构实现提供了关于后端数据如何通过 JSON/XML 消息格式提供给客户端的指南。
API 使用 REST 指南来提供可供使用的 Web 服务。REST API 在所谓的资源中提供这些 Web 服务。资源代表服务器中的单个状态,可以通过通用接口访问,然后可以通过 HTTP 动词获取或操作:GET、POST、DELETE 和 PUT。
那讲完 REST,咱们再来讲讲 RESTful 。
RESTful
RESTful 是一种接口的风格,什么风格呢?顾名思义,REST 风格
一个接口需要符合要求才能称之为 RESTful 接口
- 客户端与服务端独立运行
- 接口无国籍区分
- 接口数据可缓存
- 约束请求方法以及请求路径
比如我给大家展示一下一些 RESTful 的接口的方法以及路径
方法
- GET 以只读模式访问资源
- POST 创建一个新资源
- PUT 更新给定的资源
- DELETE 移除或删除资源
路径
- /products GET:获取所有产品
- /products/:id GET:获取由 id 指定的给定产品
- /products:id DELETE:删除给定的产品
- /products:id PUT:编辑给定的产品
- /products POST:创建一个新产品
gRPC 是啥
gRPC 是一个基于 RPC 的框架,且是面向 HTTP2 进行设计的
所以 gRPC 的优点自然也包含了 HTTP2 的优点:
- 数据传输二进制分帧
- 多路复用
- 服务端推送
- 头部压缩
gRPC 与 REST
其实 gRPC 应该跟 HTTP + RESTful 进行比较,因为 gRPC 既包含了传输协议又包含了传输规范
但是其实也可以比较一下
Protobuf 与 JSON
gRPC 和 REST 接收响应的格式不同。
REST 使用 JSON 格式接收消息。虽然我们可以接收 XML、原始二进制格式等格式的消息,但最佳实践和教程使 JSON 成为规范,而且由于 JSON 灵活、高效、平台中立且与语言无关。
gRPC 使用 Protobuf 消息格式以消息二进制格式发送请求和接收响应。
JSON 和 Protobuf 都与平台无关,这意味着它们可以被开发和使用,而与所使用的平台无关。
JSON 在系统之间传输时速度较慢。Protobuf 消息传递速度更快,因为消息包在通过网络发送之前被编组。编组是将参数和远程函数打包成消息二进制包的过程。
HTTP/1.1 与 HTTP/2
REST 在通信以及发送请求和接收响应中使用 HTTP/1.1。gRPC 使用 HTTP/2,这对于进程间通信来说甚至更快。
HTTP/1.1 比 HTTP/2 慢。HTTP/2 旨在改进 HTTP/1.1 的局限性。这使得 gRPC 在请求-响应方面比 REST 更快。
REST 在多路复用方面缺乏更多。REST 一个接一个地加载资源,一个资源必须等到前一个资源加载完成。gRPC 使用 HTTP/2,它使用 TCP 连接发送多个数据流,这些数据被拆分为二进制代码消息并为消息编号,以便客户端知道每个二进制消息属于哪个流,从而确保没有资源被阻塞.
所以我们看到,HTTP/1.1 对于多个请求是低效的。
通过服务器推送和标头压缩,gRPC 的 HTTP/2 仍然比 REST 的 HTTP/1.1 提高了性能排名。服务器推送允许 HTTP/2 在请求之前将内容从服务器推送到客户端,而 HTTP/1.1 无法做到这一点,服务器仅在请求时提供内容。Header 压缩要求 HTTP/2 能够使用 HPACK 压缩方法从 Header 中删除不必要的消息。
流媒体与请求/响应
在 REST 中,我们只能执行请求并获得响应之类的东西。这是由于它用于通信的 HTTP/1.1 协议在事物的各个方面都非常有限。
另一方面,正如我们所知,gRPC 使用 HTTP/2 进行通信。使用 TCP 连接,HTTP/2 支持来自服务器的多个数据流以及传统的请求-响应。
使用 gRPC,我们可以执行:
- 客户端流:这涉及客户端向服务器发送数据流。服务器注册以接收来自客户端的数据流,然后发送一条消息作为响应。
- 服务器流:客户端向服务器发送一个单曲,服务器将打开一个流连接,并随着时间的推移向客户端发送数据流。当流到达时,客户端将注册一个要注意的事件。
- 双向流:这是双向的。服务器和客户端可以相互发送和接收数据流。
Apifox 支持调试 gRPC
Apifox 支持基于 .proto 文件的 gRPC 调试,包括一元调用和流式调用。在创建项目时「选择 gRPC 项目」-->「导入 .proto 文件」,无需写代码即可直接调用 gRPC 接口。
在调试 gRPC 接口之前,也需要先导入作为 API 定义的 .proto 文件。如果一个 .proto 文件依赖于其他 .proto 文件,那么需要手动添加依赖关系目录。
一元调用
只需要在地址栏填写 URL 后点击「调用」按钮,即可发起一元调用。
流式调用
流式调用包含服务端流、客户端流、双向流。
在发起调用之后,你可以在 Message 标签下撰写消息并发送。Apifox 提供了一个时间线视图,按照时间顺序集中展示调用状态、发送的消息、收到的消息。点击消息之后,可以非常方便地查看消息的详情。
关于 Apifox
Apifox 是一体化 API 协作平台,可以实现 API 文档、API 调试、API Mock、 API 自动化测试,是更先进的 API 设计/开发/测试工具。Apifox 提供了一种全面的 API 管理解决方案。使用 Apifox ,你可以在统一的平台上设计、调试、测试以及协作你的 API,消除了在不同工具之间切换和数据不一致的问题。 简化了你的 API 工作流,并确保了前端、后端和测试人员之间的高效协作。
知识扩展: