为什么GraphQL查询在花括号前使用“ query”关键字?

时间:2019-05-22 14:12:42

标签: asp.net-core graphql

我创建了一个用于作者和书籍的小型API作为示例。问题是我不理解为什么查询看起来可以不同,但​​仍然获得相同的输出。我提供了3个示例。

GraphQL查询如下:

{ 
 "query":
  "query{
  author(id: 1) {
    name
  }
 }"
}

如果查询中两次是关键字“ query”,为什么此查询有效?当我这样写查询时:

{ 
 "query":
  "{
  author(id: 1) {
    name
  }
 }"
}

它也可以工作,当我这样写时:

{ 
 "query":
  "author{
  author(id: 1) {
    name
  }
 }"
}

它不起作用。为什么呢?

2 个答案:

答案 0 :(得分:3)

GraphQL指定三种类型的operations

  
      
  • 查询–只读获取。
  •   
  • 变异–先写后抓取。
  •   
  • 订阅–响应源事件而获取数据的长期请求。
  •   

您要发送到服务器的是一个具有单个属性(query)的JSON对象,该属性的值是一个GraphQL document,它表示您对GraphQL服务的实际请求。不幸的是,习惯上将此属性称为query {strong>,但与您要发送的文档内部的实际操作无关。

GraphQL文档中包含的任何操作都必须遵循以下格式:

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

NameVariableDefinitionsDirectives都是可选的。 OperationTypequerymutationsubscription中的一个。 SelectionSet是您为该操作类型请求的字段的集合。 只有选择集用大括号括起来。在您的示例中,您有两个选择集-一个包含author字段,另一个包含name字段。

上面有一个例外,称为查询速记

  

如果文档仅包含一个查询操作,而该查询未定义变量且不包含指令,则该操作可以用省略查询关键字和查询名称的简写形式表示。

换句话说,如果您的操作是:

  • 是一个查询
  • 是文档中唯一的操作
  • 不包含任何变量定义或指令

您可以省略query关键字和操作名称。这样一来,您只剩下一个选择集,就用大括号括起来。

因此您的前两个示例同样有效。第三个示例无效,因为author不是有效的操作类型。

答案 1 :(得分:1)

示例中的第一个query键是GraphQL要求实际调用终结点的条件,它必须存在才能实际运行queries {{1} }。您可以在docs中看到它。

第一个示例之所以有效,是因为在GraphQL Schema的根部必须有一个使用关键字mutationsquery的操作,并且在您的情况下,您将触发一个mutation。 / p>

第二个示例之所以有效,是因为如果您未在请求中定义哪种类型的操作(queryquery),它将始终默认执行查询。

第三个示例不起作用,因为在模式的根部没有动作mutation

我猜在这种情况下,第一个关键字author引起了一些困惑。