📜  GraphQL 与 RESTful 架构的比较

📅  最后修改于: 2022-05-13 01:56:55.799000             🧑  作者: Mango

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 系统进行通信。