GraphQL 异步查询结果
GraphQL Asynchronous query results
我正在尝试使用 GraphQL 实现批量查询接口。我可以毫无问题地获得同步工作的请求,但我不确定如何使结果异步。基本上,我希望能够启动查询和 return 某种指针,指向查询完成后最终结果所在的位置。我想这样做,因为查询有时会花费很长时间。
在 REST 中,这是微不足道的。您 return 一个 202 和 return 一个位置 header 指向客户端可以去哪里获取结果。作为规范的 GraphQL 似乎没有这个概念;它似乎总是希望同步处理请求。
在 GraphQL 中做这样的事情有什么约定吗?我非常喜欢查询规范,但我不希望在后端执行大型查询时让客户端 HTTP 连接保持打开状态长达几分钟。如果发生任何事情终止该连接,则需要重试整个查询,即使结果本身是持久的。
您尝试做的事情无法以符合规范的方式轻松解决。阿波罗引入了 @defer directive that does pretty much what you're looking for but it's still an experimental feature. I believe Relay Modern is trying to do something similar.
的概念
想法实际上是相同的——客户端使用指令将字段或片段标记为可延迟。服务器解析请求但将延迟字段保留为空。然后,它将一个或多个补丁与延迟数据一起发送到客户端。客户端能够将初始请求和补丁分别应用到其缓存,每次都像往常一样触发适当的 UI 更改。
我最近在处理类似的问题。我的用例是提交作业以创建报告并将结果返回给用户。创建报告需要几分钟,这使其成为异步操作。我创建了一个将作业提交到后端处理系统的突变,并 returned 了一个作业 ID。然后我使用查询定期轮询 jobs
字段以了解作业的状态并最终了解结果。由于结果是一个文件,我 return 一个 link 到可以下载它的不同端点(类似的方法 Github 使用)。
实际结果的轮询按预期工作,但我想通过订阅可能会更好地解决这个问题。
我正在尝试使用 GraphQL 实现批量查询接口。我可以毫无问题地获得同步工作的请求,但我不确定如何使结果异步。基本上,我希望能够启动查询和 return 某种指针,指向查询完成后最终结果所在的位置。我想这样做,因为查询有时会花费很长时间。
在 REST 中,这是微不足道的。您 return 一个 202 和 return 一个位置 header 指向客户端可以去哪里获取结果。作为规范的 GraphQL 似乎没有这个概念;它似乎总是希望同步处理请求。
在 GraphQL 中做这样的事情有什么约定吗?我非常喜欢查询规范,但我不希望在后端执行大型查询时让客户端 HTTP 连接保持打开状态长达几分钟。如果发生任何事情终止该连接,则需要重试整个查询,即使结果本身是持久的。
您尝试做的事情无法以符合规范的方式轻松解决。阿波罗引入了 @defer directive that does pretty much what you're looking for but it's still an experimental feature. I believe Relay Modern is trying to do something similar.
的概念想法实际上是相同的——客户端使用指令将字段或片段标记为可延迟。服务器解析请求但将延迟字段保留为空。然后,它将一个或多个补丁与延迟数据一起发送到客户端。客户端能够将初始请求和补丁分别应用到其缓存,每次都像往常一样触发适当的 UI 更改。
我最近在处理类似的问题。我的用例是提交作业以创建报告并将结果返回给用户。创建报告需要几分钟,这使其成为异步操作。我创建了一个将作业提交到后端处理系统的突变,并 returned 了一个作业 ID。然后我使用查询定期轮询 jobs
字段以了解作业的状态并最终了解结果。由于结果是一个文件,我 return 一个 link 到可以下载它的不同端点(类似的方法 Github 使用)。
实际结果的轮询按预期工作,但我想通过订阅可能会更好地解决这个问题。