GraphQL 是一个分层的、递归式的查询语言,它为客户端提供了灵活的查询能力,使客户端可以构建自定义的 API 请求,并获得只包含所需数据的响应。然而,当客户端需要向多个 GraphQL 端点发出查询请求时,却会面临一个合并查询的问题。本文将介绍 GraphQL 中多个查询的合并问题,并提供一种解决方案。
多个查询的合并问题
在分布式系统中,应用程序需要使用多个 GraphQL 端点来获取数据。每个 GraphQL 端点通常只提供特定类型的数据,而客户端需要从这些不同的端点中获取多个数据集并组合它们。下面是一个简单的示例:
-- -------------------- ---- ------- ----- - ----- - -- ---- - ----- - -- ----- - -
上面的查询请求了两个端点:users
和 posts
,它们分别返回用户和帖子的信息。客户端需要将这两个数据集合并在一起,以便展示给用户。在常规 REST API 的情况下,这种情况下通常使用嵌套查询解决。
解决方案
GraphQL 提供了一种解决方案,称为 @defer
指令。@defer
允许客户端将查询分解为多个部分,然后可以在需要的时候延迟获取这些部分的响应。这让客户端有机会在获取一部分数据后根据需要获取另一部分。
在以下示例中,我们将查询拆分成两个部分:
-- -------------------- ---- ------- ----- - ----- - -- ---- - ----- ------ - -- ----- - -
在上面的查询中,我们将 users
和 posts
查询分开,并在 posts
上添加了 @defer
指令。当服务器收到这个查询请求时,它将发送 users
的完整响应,但是将 posts
的响应推迟,直到客户端再次请求它。下面是客户端如何请求 posts
的响应:
query { posts { id title } }
在这个请求中,客户端只请求 posts
的响应,而不是整个查询。这使得客户端能够分解查询,按需获取数据,并合并数据集。
在查询中使用 @defer
指令时,需要使用支持 @defer
的 GraphQL 客户端和服务器。当前,只有很少的 GraphQL 实现支持 @defer
延迟查询。
总结
本文介绍了 GraphQL 中多个查询的合并问题,以及使用 @defer
指令解决这个问题的方法。使用 @defer
指令,客户端可以将查询分解成多个部分,并在需要的时候延迟获取响应。这使得客户端能够按需获取数据,并将数据集合并在一起。虽然当前只有很少的 GraphQL 实现支持 @defer
指令,但是相信随着时间的推移会越来越多。
示例代码:(后端需要添加支持)
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- ----- -------- - ---- ---- ---- - --- ---- ----- ------ - ---- ---- - --- ---- ------ ------ - ---- ----- - ------ ------- ------ ------- - -- ----- ----- - - - --- -- ----- ----- -- -- - --- -- ----- ----- -- -- - --- -- ----- ----- -- -- -- ----- ----- - - - --- -- ------ ----- -- -- - --- -- ------ ----- -- -- - --- -- ------ ----- -- -- -- ----- --------- - - ------ - ------ -- -- ------ ------ -- -- ------ -- -- ----- ------ - --- -------------- --------- ---------- --- ----------------------- --- -- -- - ------------------- ----- -- --------- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f0ff8ff6b2d6eab3ae2809