解决 GraphQL 中多个查询的合并问题

阅读时长 4 分钟读完

GraphQL 是一个分层的、递归式的查询语言,它为客户端提供了灵活的查询能力,使客户端可以构建自定义的 API 请求,并获得只包含所需数据的响应。然而,当客户端需要向多个 GraphQL 端点发出查询请求时,却会面临一个合并查询的问题。本文将介绍 GraphQL 中多个查询的合并问题,并提供一种解决方案。

多个查询的合并问题

在分布式系统中,应用程序需要使用多个 GraphQL 端点来获取数据。每个 GraphQL 端点通常只提供特定类型的数据,而客户端需要从这些不同的端点中获取多个数据集并组合它们。下面是一个简单的示例:

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

上面的查询请求了两个端点:usersposts,它们分别返回用户和帖子的信息。客户端需要将这两个数据集合并在一起,以便展示给用户。在常规 REST API 的情况下,这种情况下通常使用嵌套查询解决。

解决方案

GraphQL 提供了一种解决方案,称为 @defer 指令。@defer 允许客户端将查询分解为多个部分,然后可以在需要的时候延迟获取这些部分的响应。这让客户端有机会在获取一部分数据后根据需要获取另一部分。

在以下示例中,我们将查询拆分成两个部分:

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

在上面的查询中,我们将 usersposts 查询分开,并在 posts 上添加了 @defer 指令。当服务器收到这个查询请求时,它将发送 users 的完整响应,但是将 posts 的响应推迟,直到客户端再次请求它。下面是客户端如何请求 posts 的响应:

在这个请求中,客户端只请求 posts 的响应,而不是整个查询。这使得客户端能够分解查询,按需获取数据,并合并数据集。

在查询中使用 @defer 指令时,需要使用支持 @defer 的 GraphQL 客户端和服务器。当前,只有很少的 GraphQL 实现支持 @defer 延迟查询。

总结

本文介绍了 GraphQL 中多个查询的合并问题,以及使用 @defer 指令解决这个问题的方法。使用 @defer 指令,客户端可以将查询分解成多个部分,并在需要的时候延迟获取响应。这使得客户端能够按需获取数据,并将数据集合并在一起。虽然当前只有很少的 GraphQL 实现支持 @defer 指令,但是相信随着时间的推移会越来越多。

示例代码:(后端需要添加支持)

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

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

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

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

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

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

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

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

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

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

纠错
反馈