graphql - 将多个 GQL 突变捆绑到一个 HTTP 调用是否是一种好的做法

标签 graphql graphql-js gql

我的 GQL 服务器上有一个突变。解析器基本上只是将请求代理到处理 Dynamo 表映射的后端 Java 服务。我现在无法真正编辑该服务上的任何内容。

突变签名如下所示:

mutation {
  addItemRelation(child:"child1Id", parent:"parentId"),
}

mutation {
  removeItemRelation(child:"child1Id", parent:"parentId"),
}

在前端,我有一个界面,可让我选中复选框以将某些属性与父项相关联。目前我处理这个问题的方法是计算要添加/删除的项目。然后针对每个项目向 GQL 发送一个 HTTP 调用。

我想知道将这些全部捆绑到一个请求中是否会更好。例如,如果我添加 2 个项目并删除一个项目,我可以像这样计算 GQL 查询。

mutation {
  addItemRelation(child:"child1Id", parent:"parentId"),
  addItemRelation(child:"child2Id", parent:"parentId"),
  removeItemRelation(child: "child3id", parent: "parentId")
}

这是否比发送 3 个单独的 http 请求更好?

最佳答案

一方面,经验法则是网络请求越少越好。如果将查询分成三个单独的 HTTP 请求,则任何一个请求都可能因连接不良而失败,而其他请求则成功。至少对于一个请求,要么所有三个突变都将被执行,要么根本不执行。

另一方面,根级别突变是按顺序执行的(与所有其他字段相比,它们实际上是并行执行的)。根据您的业务案例,这种顺序执行本身可能是理想的。然而,从技术上讲,这也意味着如果您的服务器能够并行处理多个请求,则将每个字段作为单独的请求发送可能会导致所有三个突变更快地完成。在实践中,客户端和服务器之间的延迟通常是最大的因素,因此差异可能并不明显。

请注意,当您的选择集多次包含相同字段时,您需要使用别名:

mutation {
  addItemRelation(child:"child1Id", parent:"parentId"),
  addItemRelation2: addItemRelation(child:"child2Id", parent:"parentId"),
  removeItemRelation(child: "child3id", parent: "parentId")
}

关于graphql - 将多个 GQL 突变捆绑到一个 HTTP 调用是否是一种好的做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59960021/

相关文章:

pagination - 中继分页: How to initialize "after" value?

graphql - 将参数传递给 graphQL 查询

graphql - 如何在 GraphQL 类型中引用特定的 ENUM 值?

google-app-engine - 如何在 App Engine 中存储和搜索数据?

ios - API.swift 文件未更新 : Apollo GraphQL iOS

graphql - 尝试在 AWS AppSync 中删除时出错

javascript - 从 React 应用程序向 graphql API 发送一个枚举

Apollo:延迟重新获取查询

google-app-engine - 我无法查询 GQL 的 2 个属性,只有通配符有效

google-app-engine - App Engine 的过滤器与 gql 方法