兼容 REST API 的 GraphQL 编写方法

阅读时长 8 分钟读完

GraphQL 是一种用于 API 的查询语言,它可以帮助前端开发人员更高效地获取数据。然而,许多现有的应用程序都是基于 REST API 构建的,因此如何将 GraphQL 与 REST API 集成是一个值得探讨的话题。

在本文中,我们将介绍如何编写兼容 REST API 的 GraphQL 查询,并提供相关示例代码和指导意义。

REST API 与 GraphQL 的差异

REST API 和 GraphQL 有许多不同之处。其中最显著的区别是 REST API 基于 URL 和 HTTP 方法,而 GraphQL 使用单一入口点和查询语言。

REST API 的 URL 表示资源的地址,而 HTTP 方法表示对该资源执行的操作。例如,使用 GET 方法获取资源,使用 POST 方法创建资源,使用 PUT 方法更新资源,使用 DELETE 方法删除资源。

GraphQL 通过单个入口点(通常是 /graphql)接受查询,并使用查询语言来描述所需的数据。查询语言允许客户端指定其需要的数据,而不是由服务器决定返回什么。

兼容 REST API 的 GraphQL 查询编写方法

为了兼容 REST API,我们需要将 REST API 的 URL 和 HTTP 方法映射到 GraphQL 查询。我们可以使用 GraphQL 的自定义解析器来实现这一点。

以下是一个示例 REST API:

我们可以使用以下 GraphQL 查询来映射上述 REST API:

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

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

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

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

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

在上面的代码中,我们定义了 QueryMutation 类型来映射 REST API 的 URL 和 HTTP 方法。我们还定义了 User 类型来表示用户对象。

对于每个 REST API,我们都定义了相应的查询或变异。例如,users 查询对应于 GET /api/usersuser 查询对应于 GET /api/users/:idcreateUser 变异对应于 POST /api/usersupdateUser 变异对应于 PUT /api/users/:iddeleteUser 变异对应于 DELETE /api/users/:id

我们还定义了 CreateUserInputUpdateUserInput 输入类型,用于表示创建和更新用户时的输入数据。

示例代码

以下是使用 Node.js 和 Express 实现的示例代码:

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

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

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

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

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

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

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

在上面的代码中,我们定义了一个 UserType 类型,表示用户对象。我们还定义了一个 schema,包含 QueryMutation 类型。

我们使用 express-graphql 中间件将 GraphQL API 添加到 Express 应用程序中。

指导意义

在使用 GraphQL 与现有的 REST API 集成时,需要考虑以下几点:

  1. GraphQL 查询应该与现有的 REST API URL 和 HTTP 方法对应。
  2. GraphQL 查询应该使用自定义解析器来实现与 REST API 的集成。
  3. GraphQL 查询应该定义输入类型,以表示创建和更新资源时的输入数据。
  4. GraphQL 查询应该定义错误处理,以处理 REST API 返回的错误信息。

在实现 GraphQL 与现有 REST API 的集成时,需要仔细考虑这些因素,并确保 GraphQL 查询与现有 REST API 兼容。

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

纠错
反馈