在 GraphQL 中命名查询和突变有什么意义?
What is the point of naming queries and mutations in GraphQL?
请原谅这个幼稚的问题,但我已经四处寻找答案,但我发现的答案要么含糊不清,要么对我来说毫无意义。以 GraphQL 规范中的这个例子为例:
query getZuckProfile($devicePicSize: Int) {
user(id: 4) {
id
name
profilePic(size: $devicePicSize)
}
}
命名此查询有什么意义 getZuckProfile
?我看过一些关于包含多个操作的 GraphQL 文档。命名查询会以某种方式影响返回的数据吗?我自己会对此进行测试,但我没有可以轻松进行实验的服务器和数据集。但如果某处文档中的某些内容可以澄清这一点,那就太好了——到目前为止,所有示例都是超级简单的单个查询,或者是已命名但无法解释其原因的查询(除了 "here's a cool thing you can do.") 我从每个请求发送单个匿名查询时没有的命名查询有什么好处?
此外,关于突变,我在规范中看到:
mutation setName {
setName(name: "Zuck") {
newName
}
}
在这种情况下,您指定了 setName
两次。为什么?我知道其中之一是突变的字段名称,需要将其与后端模式匹配,但为什么不呢:
mutation {
setName(name: "Zuck") {
...
指定同一个名字两次有什么好处?我知道第一个可能是任意的,但为什么不是噪音?我一定是遗漏了一些明显的东西,但到目前为止我发现的一切都没有为我解决。
查询名称在服务器上没有任何意义。它仅用于客户端识别响应(因为您可以在单个请求中发送多个 queries/mutations)。
事实上,如果这是 GraphQL 请求中的唯一对象(并且没有任何参数),您可以只发送一个匿名查询对象:
{
user(id: 4) {
id
name
profilePic(size: 200)
}
}
这仅适用于查询,不适用于变更。
编辑:
正如@orta 在下面指出的那样,服务器也可以使用该名称来标识持久查询。但是,这不是 GraphQL 规范的一部分,它只是顶部的自定义实现。
我们使用命名查询,以便可以一致地监视它们,并且我们可以对查询进行持久存储。那里有重复 for query variables 以填补空白。
举个例子:
query getArtwork($id: String!) {
artwork(id: $id) {
title
}
}
你可以运行它对抗Artsy GraphQL API here
优点是每次都是相同的查询,而不是不同的字符串,因为 查询变量 是不同的位。这意味着您可以在这些查询之上构建工具,因为您可以将它们视为不可变的。
请原谅这个幼稚的问题,但我已经四处寻找答案,但我发现的答案要么含糊不清,要么对我来说毫无意义。以 GraphQL 规范中的这个例子为例:
query getZuckProfile($devicePicSize: Int) {
user(id: 4) {
id
name
profilePic(size: $devicePicSize)
}
}
命名此查询有什么意义 getZuckProfile
?我看过一些关于包含多个操作的 GraphQL 文档。命名查询会以某种方式影响返回的数据吗?我自己会对此进行测试,但我没有可以轻松进行实验的服务器和数据集。但如果某处文档中的某些内容可以澄清这一点,那就太好了——到目前为止,所有示例都是超级简单的单个查询,或者是已命名但无法解释其原因的查询(除了 "here's a cool thing you can do.") 我从每个请求发送单个匿名查询时没有的命名查询有什么好处?
此外,关于突变,我在规范中看到:
mutation setName {
setName(name: "Zuck") {
newName
}
}
在这种情况下,您指定了 setName
两次。为什么?我知道其中之一是突变的字段名称,需要将其与后端模式匹配,但为什么不呢:
mutation {
setName(name: "Zuck") {
...
指定同一个名字两次有什么好处?我知道第一个可能是任意的,但为什么不是噪音?我一定是遗漏了一些明显的东西,但到目前为止我发现的一切都没有为我解决。
查询名称在服务器上没有任何意义。它仅用于客户端识别响应(因为您可以在单个请求中发送多个 queries/mutations)。
事实上,如果这是 GraphQL 请求中的唯一对象(并且没有任何参数),您可以只发送一个匿名查询对象:
{
user(id: 4) {
id
name
profilePic(size: 200)
}
}
这仅适用于查询,不适用于变更。
编辑:
正如@orta 在下面指出的那样,服务器也可以使用该名称来标识持久查询。但是,这不是 GraphQL 规范的一部分,它只是顶部的自定义实现。
我们使用命名查询,以便可以一致地监视它们,并且我们可以对查询进行持久存储。那里有重复 for query variables 以填补空白。
举个例子:
query getArtwork($id: String!) {
artwork(id: $id) {
title
}
}
你可以运行它对抗Artsy GraphQL API here
优点是每次都是相同的查询,而不是不同的字符串,因为 查询变量 是不同的位。这意味着您可以在这些查询之上构建工具,因为您可以将它们视为不可变的。