使用 GraphQL 构建强类型 API

阅读时长 6 分钟读完

GraphQL 是一种用于构建 API 的查询语言。它的主要特点是能够按需获取需要查询的数据,而不是像传统 REST API 那样将整个资源返回给客户端。此外,它还支持强类型的查询,使得开发者在编写代码时更安全,更容易查错。

在本文中,我们将介绍如何使用 GraphQL 构建强类型 API,以及一些在该过程中可能遇到的挑战和解决方法。

GraphQL 的基本概念

查询和类型

GraphQL 的查询是由一个或多个字段组成的树状结构。每个字段都有一个名称和一个类型。类型可以是标量(例如字符串、整数等)或自定义对象(例如用户、评论等)。自定义对象可以由多个字段组成,每个字段又可以是标量或另一个自定义对象。

例如,假设我们要查询一篇文章及其作者的名称:

这个查询由两个字段组成:postauthorpost 是一个自定义对象,它有一个参数 id 和两个子字段 titleauthorauthor 又是另一个自定义对象,它有一个子字段 name

变量和参数

GraphQL 支持将查询中的某些值(例如查询参数)作为变量传递。这可以使查询可重用,并使客户端代码更清晰简洁。

例如,我们可以将上面的查询改写为:

这里我们定义了一个名为 postId 的变量,并将它的类型指定为整数。在查询中,我们使用 $postId 来引用这个变量。

端点和响应

GraphQL 定义了一些标准的端点(例如 /graphql),客户端可以向这些端点发送查询请求。查询响应是一个 JSON 对象,其中包含了客户端请求的字段和值。如果在查询过程中出现了错误,响应中会包含错误信息。

以下是一个示例响应:

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

GraphQL 的优点

与传统 REST API 相比,GraphQL 具有以下优点:

可按需获取的数据

使用 GraphQL,客户端可以仅获取需要的字段,而不是整个资源。这大大减少了不必要的带宽消耗和数据延迟。此外,此方法还有助于将客户端与后端解耦,并使 API 更具可扩展性。

强类型的查询

GraphQL 支持强类型的查询,这使得开发人员能够在编写代码时更安全,更容易调试。例如,如果您想查询一个不存在的字段,GraphQL 将在编译时捕获该错误,而不是等到运行时才抛出错误。

可编程的架构

GraphQL 没有像 REST API 那样的刚性结构。因此,使用 GraphQL,开发人员可以更轻松地根据具体需要构建 API,并在 API 中添加新功能。此外,GraphQL 还支持自定义指令,使得开发者能够根据自己的需要添加自定义行为。

如何使用 GraphQL 构建 API

使用 GraphQL 构建 API 的过程分为以下几个步骤:

1. 定义类型

首先,您需要定义 API 上的所有类型。这些类型可以是标量或自定义对象。例如,以下代码片段显示了如何定义一个 Post 类型:

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

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

这个 Post 类型包含了一个整数型的 id 字段、一个字符串型的 title 字段、一个字符串型的 content 字段和一个用户型的 author 字段。User 类型同理。

2. 定义查询和变量

接下来,您需要定义您希望客户端能够查询的字段。例如,以下代码片段定义了一个查询名为 post,客户端可以通过其 id 参数查询一篇文章:

客户端可以将参数 id 作为输入变量。例如,以下代码片段显示了如何定义变量:

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

3. 创建解析器

最后,您需要创建一个解析器,将 GraphQL 查询解释为后端代码,并提供结果。解析器必须实现每个字段的函数,这些函数将从数据库中检索数据并将其转换为适当的 GraphQL 类型。

以下是使用 Node.js 和 Express 框架的解析器示例:

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

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

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

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

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

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

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

总结

GraphQL 使得开发者可以按需获取数据,编写安全的代码,和自定义扩充功能。在构建 GraphQL API 时,定义类型,定义查询和变量,然后创建解析器,即可完成整个过程。GraphQL 具有许多优点,并且是一种高度灵活的 API 构建工具。因此,强烈建议开发人员在构建复杂的 API 时考虑使用 GraphQL。

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

纠错
反馈