在 GraphQL 中使用数据源 —— 封装 REST API

阅读时长 9 分钟读完

在 GraphQL 中使用数据源 —— 封装 REST API

GraphQL 是一种强类型、可扩展、容错的查询语言,它可以用来定义应用程序所需的数据结构,然后在一个 API 中提供这些数据。在 Web 开发中,REST 是一种常见的 API 设计模式,它已经成为我们访问和交互数据的主要方式。然而,REST API 的缺陷在于它的数据响应是固定的和静态的,这意味着它无法根据请求的需求动态地返回数据。而 GraphQL 可以让客户端精确地指定需要的数据,提高了数据传输的效率和可靠性,这使得 GraphQL 变得越来越流行。

然而,在使用 GraphQL 时,我们还需要考虑到数据源的问题。一方面,GraphQL 并不是一种新的数据库或数据存储技术,它仅仅是一种查询语言。想要在 GraphQL 中获取数据,我们必须将数据源转换为 GraphQL 可以理解的形式。另一方面,许多我们已经在使用的现有数据源可能并没有 GraphQL 接口。因此,我们需要一种方法来将这些数据源封装成 GraphQL API,以便与 GraphQL 客户端交互。

在这篇文章中,我们将探讨如何在 GraphQL 中使用数据源,以及如何将 REST API 封装成 GraphQL API。我们将介绍一些最佳实践和示例代码,帮助您开始构建自己的 GraphQL API。

GraphQL 数据源

GraphQL 数据源指的是我们可以使用 GraphQL 查询的各种数据存储。这些数据源可以是数据库、API、文件、数据缓存等。GraphQL 数据源的好处在于我们可以将它们转换为 GraphQL 开发者友好的形式,并以统一的方式对外暴露。

要使用 GraphQL 数据源,我们需要先了解 GraphQL 的基本结构。在 GraphQL 中,每一个类型都有其自己的字段,这些字段可以进行查询和修改。在定义数据源时,我们需要将其映射到 GraphQL 类型上,并定义查询类型,以便客户端能够使用它们。

例如,假设我们有一个数据库中的账户记录,我们可以将其映射为 GraphQL 的类型,并定义一个查询类型,以便客户端可以查询它们:

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

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

在这个例子中,我们定义了一个 Account 类型,它包含 id、username 和 email 三个字段。我们还定义了一个查询类型。account(id) 可以查询单个账户,而 accounts 可以查询所有账户。

REST API 和 GraphQL API 的对比

通常,我们使用 REST API 来构建 Web 应用程序。但是,REST API 有一些明显的缺点。例如,在 REST API 中,客户端可能会收到一些它不需要的数据,这会导致不必要的延迟和数据传输。此外,REST API 的响应通常不是强类型的,这给客户端带来了不确定性。

相比之下,GraphQL 的查询响应是强类型的,客户端能够精确地指定它需要的数据,并且可以将多个请求组合成一个单独的请求。GraphQL 还支持订阅和实时应用程序的构建。

但是,我们不完全可以抛弃 REST API。毕竟,REST API 是 Web 应用程序的重要组成部分。因此,我们需要一种方法将 REST API 封装成 GraphQL API,而不是彻底替换 REST API。

在封装 REST API 时,我们需要将 REST API 的数据结构映射到 GraphQL 类型上,并使用 GraphQL 的查询语言来查询 REST API。GraphQL 的查询语言类似于 SQL。它可以嵌套多个查询,并支持条件查询和排序。

封装示例

在这个示例中,我们将演示如何将 REST API 封装成 GraphQL API。我们将使用 GitHub API 作为数据源,这将允许我们查询 GitHub 上的存储库信息。

在这个示例中,我们需要定义查询类型和存储库类型,将来可以在 GraphQL 中查询它们。我们还需要定义一个 REST API 客户端,在将 REST API 映射到 GraphQL 类型时使用。

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

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

在这个示例中,我们定义了一个 Repository 类型,它包含名称、URL 和创建时间三个字段。我们还可以定义一个查询类型,它包含 repository 和 userRepositories 两个查询。repository 查询可以获取单个存储库,而 userRepositories 查询可以获取用户所有的存储库信息。

接下来,我们需要实现一个 REST API 客户端,以便我们可以将存储库信息映射到 GraphQL 类型上。在这个客户端中,我们将使用 axios 包来发出 REST 调用。

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

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

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

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

在这个实现中,我们使用构造函数初始化一个 REST API 客户端,然后实现 getRepository 和 getUserRepositories 两个方法来获得存储库信息。此外,我们还将存储库信息映射为 GraphQL Repository 类型,并返回 GraphQL 客户端可以使用的结果。

最后,我们需要将 REST API 映射到 GraphQL API。我们将使用 graphql-yoga 包提供的 GraphQL 服务器来实现 GraphQL API。

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

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

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

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

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

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

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

在这个示例中,我们先定义类型定义和解析器函数。然后,我们将实例化一个 GitHub REST API 客户端,用于将 REST API 映射到 GraphQL 类型上。最后,我们将启动一个 GraphQL 服务器,它在本地的 4000 端口上运行。

使用 GraphQL API

现在,我们已经创建了 GraphQL API,让我们来测试它,以确保它可以正常工作。

首先,我们可以使用 Query Explorer 工具来查询我们的 API。该工具可以让我们构建和测试 GraphQL 查询,而不必编写任何代码。

打开 http://localhost:4000,在左侧边栏上找到运行查询。下面是一些查询示例:

上面的查询演示了如何从 GitHub API 中获取存储库信息,并将其映射为 GraphQL 类型。我们甚至可以在查询中使用参数,以根据我们的需求获取不同的存储库。

结论

在本文中,我们介绍了如何在 GraphQL 中使用数据源,并将 REST API 封装成 GraphQL API。通过将现有数据源映射为 GraphQL 类型,我们可以使用 GraphQL 来查询和修改数据,从而实现 Web 应用程序的高效和可靠。在实现 GraphQL API 时,我们需要遵循一些最佳实践,包括定义类型、编写解析器函数和使用 GraphQL 服务器等。这些最佳实践将帮助我们构建高质量的 GraphQL API,以改进我们的 Web 应用程序的性能和可靠性。

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

纠错
反馈