如何将 RESTful API 转换为 GraphQL 类型

阅读时长 9 分钟读完

在现代 Web 开发中,RESTful API 是一种非常流行的 Web API 架构风格,它可以使客户端通过 HTTP 协议与服务器进行交互。然而,RESTful API 在一些场景下存在一些不足,这些不足包括缺乏灵活性和效率低下。GraphQL 是由 Facebook 开发的一种数据查询和操作语言,它的出现可以弥补 RESTful API 的这些不足。那么,如何将现有的 RESTful API 转换为 GraphQL 类型呢?本文将介绍如何利用 GraphQL 来访问已有的 RESTful API,并给出一些示例代码。

RESTful API 与 GraphQL 的比较

RESTful API 和 GraphQL 都是用于构建 Web API 的工具,它们有如下不同之处:

  • 数据结构的灵活性

    RESTful API 采用固定的数据结构,客户端只能获取服务端返回的完整数据,无法自定义查询数据。而 GraphQL 允许客户端指定想要获取的字段,通过 GraphQL 的解析器,服务端将客户端请求的字段解析为数据库的查询语句,返回符合条件的数据。这种解析器可以完成嵌套的属性查询,也可以在客户端直接组合多个查询。

  • 网络效率

    RESTful API 的一个 API 路径只能返回一个 URI 的资源,这意味着客户端必须发送多个 HTTP 请求来获取多个 URI 的资源才能完成一个查询,称为过度获取(over-fetching)。相反,GraphQL 允许客户端请求多个资源并仅返回必要的数据,这称为准确获取(under-fetching)。

  • 版本控制

    在 RESTful API 中,客户端只能请求服务端当前发布的版本。版本更新会对客户端造成不必要的负担,可能会导致代码不同步。通过 GraphQL,客户端可以自由选择版本,前端可以根据需要扩展或缩小查询的范围,而无需担心将来发生的服务端变更导致版本不同步。

  • 可扩展性

    RESTful API 通常需要额外的文档或代码示例来帮助客户端实现和理解。而 GraphQL 允许通过 introspection 原语自动发现可用架构和查询,这使得从客户端查询到 API 本身成为可能。

如果您已经有了 RESTful API,您可以使用 Apollo Server 来创建一个 GraphQL 服务,作为 RESTful API 的“包装器”以提供更多的灵活性和网络效率。

这里分为三个步骤: 构建 GraphQL Schema、解析查询和调用 RESTful API。

步骤一:构建 GraphQL Schema

首先需要定义 GraphQL Schema,这相当于定义整个 API 的结构。

下面是一个模拟的 RESTful API,它向客户端提供了访问书籍的方式。

我们可以利用 Apollo Server 根据 RESTful API 构建一个对应的 GraphQL 服务。

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

这里定义了一个类型 Book 和一个查询类型 Query,然后将它们传递给一个新的 ApolloServer 实例。

步骤二:解析查询

继续完成查询的解析,返回客户端需要的数据和类型。

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

解析查询的方式是通过实现一个 resolvers 对象,这个对象可以使用客户端的查询字段并返回相应的数据。例如,当客户端查询 books 时,resolvers 中的 books 函数会被调用,该函数会根据 RESTful API 的 GET /books 接口获取数据并将其作为 Book 类型的列表返回。

步骤三:调用 RESTful API

由于 RESTful API 已经实现了基本的服务端逻辑,我们只需要将查询转换成合适的 RESTful API 调用,然后解析返回结果即可。

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

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

这个示例中,我们在 books 解析器函数中发出了一个 GET 请求。当数据返回时,我们映射返回的所有书籍,并添加一个新的属性 type,这个属性不是从 RESTful API 返回的,而是在 GraphQL 解析器中添加的。这样一来,我们就可以比单独使用 RESTful API 应用程序提供更丰富的数据集。

代码示例

下面我们来看一个完整的例子。

  1. 首先我们创建一个假的 RESTful API(server.js):
  1. 在 Apollo Server 中,我们构建一个基于 GraphQL 的 API。
-- -------------------- ---- -------
----- - ------------- --- - - -------------------------
----- ----- - ----------------------
----- -------- - ----
  ---- ---- -
    --- ---
    ------ ------
    ------- ------
    ------ -----
  -
  ---- ----- -
    ------ ------
  -
--
----- --------- - -
  ------ -
    ----- ------------- ----- -------- -
      ----- -------- - ----- -------------------------------------

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

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

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

使用 ApolloServer 创建了一个 GraphQL 服务,并在 resolvers 中实现了 books 函数来返回 Book 类型的列表。最后启动 Apollo 服务器,并变开放端口 listening。

  1. 运行 RESTful API 和 GraphQL 服务器。

在命令行界面,输入命令:

  1. 访问 GraphQL API。

在浏览器中打开地址 http://localhost:4000/graphql。可以看到类似的 GraphQL Playground 页面。在左侧的交互式查询窗口中,尝试输入下列查询:

这是一个 GraphQL 查询的示例,用于在 RESTful API 中检索可用的所有书籍。该查询将从由 Apollo Server 启动的 GraphQL 服务获取所有符合条件的书籍信息,然后只返回 idtitleprice 等属性。

总结

GraphQL 是一个灵活和可扩展的 API 架构,对于实现 RESTful API 整合的系统来说是一个有用的补充。因为 GraphQL 的强大,它可以帮助开发人员实现前端服务的更灵活开发和高效数据查询。在实现 GraphQL 和 RESTful API 相互运作之前,需要仔细考虑您的用例,了解您的数据模型,并为您的前端应用程序的需求考虑 API 架构的可伸缩性。但是无论您的选择是 GraphQL 还是 RESTful API,对于程序员来说,选择适合其需求的技术是至关重要的。

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

纠错
反馈