GraphQL 与 RESTful 架构的比较
在本文中,我们将比较 RESTful 架构和 GraphQL 架构。 GraphQL 是该领域的新手,RESTful 在 GraphQL 诞生之前表现良好。
REST:它是 Representational State Transfer 的首字母缩写。 REST 是一种用于创建 Web 服务 (API) 的 API 设计风格架构。
RESTful 架构的特点:
- REST 服务器实现比其对应的 SOAP 更简单,这也是它在新开发人员中流行的原因之一。
- REST 是无状态的,服务器不会以会话或其他任何形式存储客户端的状态。每个请求都是一个新请求。
- REST 由 JSON 和 XML 支持,两者都支持有助于开发人员熟悉一种 XML 或 JSON。
- 错误消息的出现是有意义的,开发人员可以很容易地猜出故障。
GraphQL: GraphQL 最初由 Facebook 内部开发,供自己使用,后来于 2015 年发布给人们。它是一种用于 API 的操作和数据查询语言。它是响应传入 API 请求的运行时。
GraphQL 架构的特点:
- GraphQL 只有 1 个端点,因此易于管理。
- 精确获取数据。由于字段与 GraphQL 操作一起传递,因此仅返回所需的字段。
- 发布不同版本的 API 就像编辑之前的代码一样简单。
- GraphQL API 是客户端驱动的。这意味着客户端决定 API 的结构,而 REST 则由服务器决定 API 实现。
REST 和 GraphQL 的相似之处:
- 它们都具有返回 JSON 格式数据的能力。
- REST 和 GraphQL 可以使用 HTTP GET 方法获取数据。但是,GraphQL API 服务器通常只有一个 POST 端点。不过,可以使用 GET 和 GraphQL 来获取数据。
- REST 和 GraphQL 将每个实体识别为资源。每个资源都有一个与之关联的 ID。
REST 和 GraphQL 的比较:
API结构:
- REST:在 RESTful 调用中,我们可以使用不同类型的 HTTP 方法,例如 GET、POST、DELETE。该呼叫还包括需要被呼叫的端点。
GET /api/v1/users/geeksforgeeks
- GraphQL:在 GraphQL 调用中,只允许使用 POST 方法。对于应用程序,端点也保持不变。为了服务不同类型的请求,会构建一个“查询”并随请求一起发送。
POST /graphql {query {users(id:"geeksforgeeks") { firstName lastName dateCreated }}}
查询样本:
- REST: REST 定义了“什么”。用 REST 编写的 API 专注于“什么”是响应。
GET /users/:id
- GraphQL:在 GraphQL 调用中,只允许使用 POST 方法。对于应用程序,端点也保持不变。为了服务不同类型的请求,会构建一个“查询”并随请求一起发送。
POST /graphql {query (name:"geeksforgeeks") { id dateCreated }}
端点数:
- REST:在 REST 中,端点以某种方式与特定的方法/资源绑定。为了访问不同的资源,创建了不同的端点。
Makes a new user: POST /users/GFG Get user with id: GET /users/id
- GraphQL:在 GraphQL 中,只创建一个端点来服务于各种资源。
Fetches datecreated and numberofarticles for a user with id gfg: POST /graphql/{user(id:"gfg") {datecreated numberofarticles}} Gets title of the blog with id 53289: POST /graphql/{blog(id:"53289") {title}}
文档:
- REST:在 REST 中,文档由端点的开发人员维护,它们用于访问的资源、它们采用的参数(如果有)、每个字段采用的值的类型以及其他规范。
- GraphQL:在 GraphQL 中,文档是内置的,因为有关 GraphQL 模式支持的查询的信息已提供或可获取。这导致开发人员参考文档的次数减少。
带宽:
- REST:在 REST 中,选定的资源被发送到客户端,并且必须在客户端完成对所需信息的过滤。这会消耗高带宽,因为客户端不需要的信息也会被发送。
- GraphQL: GraphQL 提供了一种方法来识别必填字段,并且仅将它们发送给客户端。这导致低带宽消耗。
数据类型:
- REST: RESTful 服务也可以返回弱类型数据。数据类型是文档中的关键信息。不提供此信息,因为它不存在可能会导致客户端在调用端点时遇到困难。
- GraphQL:虽然 GraphQL 主要是强类型的,因为在调用查询之前必须创建模式。
沟通:
- REST: REST 仅通过 HTTP/HTTPS 协议进行通信。
- GraphQL: GraphQL 服务器可以通过 HTTP、HTTPS、TCP、WebSockets、UDP、FTP 进行通信。
错误处理:
- REST:在 REST 中,响应的状态由 HTTP 标头中的HTTPStatusCode指示。这些状态代码是标准化的,并向客户端指示错误类型。
- GraphQL: GraphQL 总是通过 HTTP 返回 200 作为响应状态。处理查询时发生的错误(如果有)作为“错误消息”与响应一起发送。
请求编号:
- REST:在 REST 中,由于资源的结构不同,可以有多个对资源的请求。例如,要检索学生的详细信息,首先使用id获取学生,然后使用字段feeid获取学生的费用详细信息
- GraphQL:在 GraphQL 中,一次调用可以访问多个资源,从而减少应用程序发出的请求数量,从而消耗更少的数据。
缓存:
- REST:在 REST 中,使用 HTTP 来利用和实现 HTTP 缓存。在 HTTP 标头中,此类控制信息与响应一起传递。标头是“Cache-Control”,服务器可以决定如何使用它。
- GraphQL:在 GraphQL 中,不存在这样的缓存机制。因此,客户端有责任在其端缓存资源。
结论: REST 是一种古老的稳定方法,迄今为止性能非常好。 GraphQL 正在加速发展并获得了很大的动力。如果您认为 GraphQL 仅适用于新产品和新代码,那您就错了。它可以在使用 REST 的旧系统上执行,您仍然可以集成 GraphQL 从旧的 REST 系统中获取数据。这将有助于改进客户端层。您可以将查询写入新的 GraphQL 服务器以与 REST 系统进行通信。