在GraphQL中命名查询和突变有什么意义?

时间:2015-12-01 03:15:06

标签: graphql

请原谅这个天真的问题,但我已经全神贯注地寻找答案了,我发现的一切都是模糊的,或者对我毫无意义。以GraphQL规范为例:

query getZuckProfile($devicePicSize: Int) {
  user(id: 4) {
    id
    name
    profilePic(size: $devicePicSize)
  }
}

命名此查询有什么意义?我已经看到了包含多个操作的GraphQL文档。命名查询是否会以某种方式影响返回的数据?我自己测试了这个,但是我没有一台可以轻松玩的服务器和数据集来进行实验。但是如果某个文档中的某些内容可以澄清这一点会很好 - 到目前为止所有示例都是超级简单的单个查询,或者是被命名但不能解释它们为什么的查询(除了&# 34;这里你可以做的很酷。")当我按照请求发送单个匿名查询时,我从命名查询中得到什么好处?

另外,关于突变,我在规范中看到了:

mutation setName {
  setName(name: "Zuck") {
    newName
  }
}

在这种情况下,您需要指定setName两次。为什么?我得到其中一个是变异的字段名称,需要将其与后端模式匹配,但为什么不:

mutation {
  setName(name: "Zuck") {
...

我可以两次指定相同的名称有什么好处?我知道第一个可能是任意的,但为什么它不是噪音?我必须遗漏一些明显的东西,但到目前为止我找不到任何东西已经为我清除了。

2 个答案:

答案 0 :(得分:12)

查询名称在服务器上没有任何意义。它仅用于客户端识别响应(因为您可以在单个请求中发送多个查询/突变)。

事实上,如果这是GraphQL请求中的唯一内容(并且没有任何参数),您只能发送一个匿名查询对象:

{
  user(id: 4) {
    id
    name
    profilePic(size: 200)
  }
}

这仅适用于查询,而非突变。

使用query(或mutation)关键字后,您需要提供一个名称。理论上,即使没有名称,服务器也可以处理请求,但这不是当前GraphQL规范允许的。

修改

正如@orta在下面所述,服务器也可以使用该名称来标识持久查询。但是,这不是GraphQL规范的一部分,它只是一个自定义实现。

答案 1 :(得分:0)

我们使用命名查询,以便可以对其进行一致的监视,并可以对查询进行持久存储。那里for query variables可以填补空白。

例如:

{{1}}

您可以针对Artsy GraphQL API here

运行它

优点是每次查询相同,而不是不同的字符串,因为 query变量是不同的位。这意味着您可以在这些查询之上构建工具,因为您可以将它们视为不可变的。