理解 GraphQL 和 REST 的差异,以及如何选择其中之一

阅读时长 6 分钟读完

前言

随着 Web 应用的不断发展和变化,越来越多的 Web 开发者开始关注和使用 GraphQL 和 REST 这两种 Web API,使得这两种 API 成为当今 Web 开发中最受欢迎的技术之一。

GraphQL 和 REST 的差异在于它们对资源的表达方式和取得方式不同。本文将详细介绍 GraphQL 和 REST 的优缺点、使用情况以及如何选择其中之一。

GraphQL 和 REST 的区别

GraphQL

GraphQL 是 Facebook 开源的一种数据查询和操作的语言,它旨在解决 REST API 的不足之处。相比于 REST API,GraphQL 带来了更为灵活的查询方式和更为精确的结果集。下面是 GraphQL 查询的一个示例:

-- -------------------- ---- -------
-
  -------- ------ -
    -----
    ------
    ------- -
      -----
      -----
    -
  -
-

在这个示例中,我们查询了一个名为 user 的对象,这个对象有一个 id 是 123,我们要求返回该对象的 “name”、“email” 和“friends” 的信息。其中“friends”也是一个对象,并且我们同样查询了“friends”对象的“name”和“email”信息。

REST

REST 是 Representational State Transfer 的缩写,即表现层状态转移。REST 是基于 HTTP 协议的一种 Web API 设计风格。每个资源都有一个唯一的 URL,通过 HTTP 方法去访问这些资源来进行 CRUD 操作。下面是 REST API 的一个示例:

在这个示例中,我们通过 HTTP GET 方法请求一个名为“users”的资源,这个资源 ID 是 123。并且我们请求返回的数据类型为“application/json”。

GraphQL 和 REST 的优缺点

GraphQL 的优缺点

优点:

  • 更为精确的结果:GraphQL 可以查询所需的数据,消除了 REST API 中存在的查询冗余及过渡获取的问题。
  • 灵活性:GraphQL 允许开发人员自由制定查询和数据模式,不受资源 URI 的限制。
  • 易于扩展:GraphQL 支持多个数据源和多语言,使得它更容易扩展使用。

缺点:

  • 学习曲线较陡峭:GraphQL 是一种新的技术,需要开发人员进行学习、调查和评估,并适应新的 IDE 和工具的使用。
  • 服务端性能:在请求的查询较复杂的情况下,GraphQL 服务端可能会出现性能瓶颈。

REST 的优缺点

优点:

  • 轻松可理解:REST 风格很容易理解,因为它基于已有的 HTTP 协议。
  • 面向资源:REST 提供了对 Web 资源的灵活性,开发人员可以使用不同的技术来处理不同的资源。
  • 可测试性:REST API 的结果可以通过浏览器或者其他 HTTP 客户端进行测试。

缺点:

  • 不适合大型查询:REST 通常需要进行多次查询来获取满足需求的数据,因此在处理大量数据时可能会出现性能问题。
  • 模式固定:使用 REST API 必须进行资源 URI 格式的定义,这限制了查询和更新的灵活性,容易导致冗余查询的情况。

如何选择 GraphQL 或 REST?

选择 GraphQL

  • 数据复杂度高:如果你的数据组织存在多个关联关系,且每个资源对应不同的查询需求,则使用 GraphQL 更优,因为 GraphQL 通过单一的查询可以获取相关联的数据。
  • 需要数据的一部分:如果 API 表示的数据模型中存在一个耦合紧密的层,那么使用 GraphQL 可以查询和返回这个层中的一部分。
  • 集中管理数据:如果你要管理和查询的数据由多个服务提供,使用 GraphQL 会更加合适,因为它能够集中查询数据。

选择 REST

  • CRUD 操作:如果你需要实现简单的 CRUD 操作,REST 能够很好地完成这些操作。
  • 缓存:REST API 通常比 GraphQL 更容易进行缓存,因为 resourced-based 的 URL 可以被 HTTP 缓存使用。
  • 渐进式增强:如果你从传统的 Web 开发中过渡到 API 开发,REST 可能更适合你。

结论

GraphQL 和 REST 都有各自的优点和缺点,因此在选择使用哪种 API 架构之前,需要权衡两者的优劣,并根据具体情况进行选择。如果你的需求是需要返回大量的数据,并且需要使用多次查询,那么 REST API 可能更适合。如果你需要查询没有固定属性的数据,或者希望将服务端响应时间缩短,那么 GraphQL API 则可能是更好的选择。

参考代码

GraphQL

下面是一个使用 GraphQL 的 API 示例代码:

-- -------------------- ---- -------
----- - ------------- --- - - -------------------------

----- -------- - ----
  ---- ---- -
    --- ---
    ----- ------
    ------ ------
    -------- ------
  -

  ---- ----- -
    -------- ----- ----
  -
--

----- --------- - -
  ------ -
    ----- --- - -- -- -- -
      ------ --------------------
    --
  --
  ----- -
    -------- -- -- -- -- -
      ------ ---------------------------- -- --------------
    --
  --
--

----- ------ - --- -------------- --------- --------- ---

----------------------- --- -- -- -
  --------------- ------ ----- -- ---------
---

REST

下面是一个使用 REST 的 API 示例代码:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

--------------------- ----- ---- -- -
  -----------------------------------------
---

---------------- -- -- -
  ------------------- ------- -- ---- -------
---

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67482f3293696b0268e98df9

纠错
反馈