从 REST 到 GraphQL:如何优雅地实现 API 迁移

阅读时长 9 分钟读完

REST API (Representational State Transfer API) 毫无疑问是目前前端应用程序最流行的数据交换协议。REST API 可以使我们构建可伸缩的、可维护的 Web 应用程序。然而,在不同的应用程序生命周期中,REST API 可能会存在一些问题,尤其是在应用程序开始发展时,REST API 的一些缺点会变得非常明显。GraphQL 提供了一种弥补这些缺陷的新型解决方案,它可以更好地处理 API 的结构和复杂度。在本文中,我们将探讨如何优雅地从 REST API 迁移到 GraphQL。

REST API 的缺陷

REST API 目前存在一些缺陷,尤其是在应用程序开始变得复杂时。主要的缺陷有:

  • API 端点过多:REST API 在创建多对多的关系时需要创建许多 API 端点。API 端点的数量很容易爆炸式增长。
  • 过度获取:REST API 通常返回完整的资源对象,在客户端需要的情况下捕获很多不必要的数据。这可能会带来显著的性能问题,尤其是在缓存key的情况下。
  • 多次请求:REST API 不支持在单个请求中检索多个资源和子资源,这可能导致文章、评论和其他资源的瀑布式加载延迟。
  • 缺少灵活性:REST API 有明确定义的端点和请求和响应数据的格式。这使得它很难适应某些应用程序的需要。

这些问题可能会导致性能下降、管理 API 的难度升高,并带来其他问题。因此,GraphQL 已经成为许多开发人员解决这个问题的首选方案。

GraphQL 的优点

GraphQL 是一个新兴的 API 数据查询语言和运行时,它由 Facebook 发布。在 GraphQL 和 REST API 之间进行比较,GraphQL 有很多有点:

  • 单个入口: GraphQL 可以通过一个入口点检索多个资源和子资源。这样做可以避免过度获取等性能问题。
  • 灵活性: GraphQL 可以提供基于请求的数据的形式,请求的所需数据可以在运行时建模和提供。
  • 探索性: 由于没有端点和请求和响应数据的明确格式,因此探索 GraphQL API 变得非常容易。
  • 声明式数据:GraphQL查询定义了可以从API中检索的数据的结构。你可以把它看作是字段选项语句的树形结构,它表现了API可能提供的字段。当客户端向服务端发送查询时,它会遍历查询树,在树中选择指定的字段,这是在一次请求中发生的。这种声明性方法有助于减少与查询结果构造相关的逻辑复杂性。
  • 前端驱动:GraphQL有利于前端工程师。例如,前端开发可以根据UI层次结构定义它们的查询。然后,他们可以调整它们的查询以符合API要求。这意味着,前端工程师可以拥有最终的说话权,而不是需要和 API 后台开发沟通和协商每一个接口。

这些都使得 GraphQL 成为现代化应用程序开发的绝佳选择。

如何将 REST API 迁移到 GraphQL

当数据需求变得比表格或线框图中显示的更大或更复杂时,过渡到 GraphQL 可以是很好的选择。要进行此迁移,可以遵循以下步骤:

步骤1: 创建 GraphQL schema

GraphQL schema 是 GraphQL API 可用的 schema。它描述了所有查询和变量。在开发时,schema 可以通过代码定义。 GraphQL schema 骨架看起来像这样:

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

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

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

步骤2: 定义 resolver 函数

为了完全寻址和查询多个资源,你需要定义其他来解析其他子资源的 resolver:

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

步骤3: 编写 GraphQL API

要在 Node.js 中将 GraphQL 添加到现有的应用程序中,请使用 Apollo Server。

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

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

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

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

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

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

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

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

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

步骤4: 迁移数据和查询

你必须迁移你的现有数据,可以通过 GraphQL 在 REST API 上执行查询来解决这个问题。 例如,对于一个独立的 RESTURL:

下面是一个步骤4的GraphQL查询

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

这个查询将返回一个包含每个用户的 ID、姓名、电子邮件和名为 posts 的一个嵌套查询,其中包含所有发布到他们的文章的名字。

示例代码

请参见下列代码,这是使用 Apollo Server 的 GraphQL API。

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

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

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

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

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

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

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

结论

GraphQL 为大型应用程序提供了一种优雅、灵活的方式,使开发人员能够在客户端看到所需的内容。 GraphQL 不会在你的代码中强制出现逻辑混乱或冗余,因为它自带了适合自己的新工具和特性。因此,如果你需要在客户端提高性能和可维护性,强烈建议您开始考虑使用 GraphQL API。

总之,这将是一项繁琐的任务,需要开发人员协作,以创建一个能够满足现代应用程序所需的 API 服务。请确保您为每个端点和查询以及相应的Resolver编写足够的单元测试,这样你可以保证你的 API 在运行时正确地工作且健壮。

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

纠错
反馈