我创建了一个用于作者和书籍的小型API作为示例。问题是我不理解为什么查询看起来可以不同,但仍然获得相同的输出。我提供了3个示例。
GraphQL查询如下:
{
"query":
"query{
author(id: 1) {
name
}
}"
}
如果查询中两次是关键字“ query”,为什么此查询有效?当我这样写查询时:
{
"query":
"{
author(id: 1) {
name
}
}"
}
它也可以工作,当我这样写时:
{
"query":
"author{
author(id: 1) {
name
}
}"
}
它不起作用。为什么呢?
答案 0 :(得分:3)
GraphQL指定三种类型的operations:
- 查询–只读获取。
- 变异–先写后抓取。
- 订阅–响应源事件而获取数据的长期请求。
您要发送到服务器的是一个具有单个属性(query
)的JSON对象,该属性的值是一个GraphQL document,它表示您对GraphQL服务的实际请求。不幸的是,习惯上将此属性称为query
{strong>,但与您要发送的文档内部的实际操作无关。
GraphQL文档中包含的任何操作都必须遵循以下格式:
OperationType [Name] [VariableDefinitions] [Directives] SelectionSet
Name
,VariableDefinitions
和Directives
都是可选的。 OperationType
是query
,mutation
或subscription
中的一个。 SelectionSet
是您为该操作类型请求的字段的集合。 只有选择集用大括号括起来。在您的示例中,您有两个选择集-一个包含author
字段,另一个包含name
字段。
上面有一个例外,称为查询速记:
如果文档仅包含一个查询操作,而该查询未定义变量且不包含指令,则该操作可以用省略查询关键字和查询名称的简写形式表示。
换句话说,如果您的操作是:
您可以省略query
关键字和操作名称。这样一来,您只剩下一个选择集,就用大括号括起来。
因此您的前两个示例同样有效。第三个示例无效,因为author
不是有效的操作类型。
答案 1 :(得分:1)
示例中的第一个query
键是GraphQL要求实际调用终结点的条件,它必须存在才能实际运行queries
或 {{1} }。您可以在docs中看到它。
第一个示例之所以有效,是因为在GraphQL Schema的根部必须有一个使用关键字mutations
或query
的操作,并且在您的情况下,您将触发一个mutation
。 / p>
第二个示例之所以有效,是因为如果您未在请求中定义哪种类型的操作(query
或query
),它将始终默认执行查询。
第三个示例不起作用,因为在模式的根部没有动作mutation
。
我猜在这种情况下,第一个关键字author
引起了一些困惑。