我想确认我是否正确理解了GraphQL模式。使用以下(我想是非常静态的)简单模式:
type User {
login: String
password: String
}
type System {
users: [User!]!
}
只有3个可能的有效查询:
query SimpleQuery1 {
system {
users {
login
password
}
}
}
query SimpleQuery2 {
system {
users {
login
}
}
}
query SimpleQuery3 {
system {
users {
password
}
}
}
就是这样,没有其他可能的查询了?
答案 0 :(得分:1)
您可以有任意数量的ignored tokens,例如空格,换行符和逗号,从技术上来说会导致不同的文档。
除了更改操作名称(即SimpleQuery2
)之外,您还可以使用query shorthand:
{
system {
users {
login
}
}
}
响应中字段的顺序取决于请求中它们的顺序,因此这两个查询将产生不同的响应(与键的顺序有关):
query {
system {
users {
login
password
}
}
}
query {
system {
users {
password
login
}
}
}
您可以有重复的字段,尽管在实际响应中将消除重复的字段:
query {
system {
users {
login
login
login
}
}
}
但是您也可以利用aliases来保留重复的字段:
query {
system {
users {
login1: login
login2: login
login3: login
}
}
}
您的查询可以使用一个或多个fragments:
query {
system {
users {
...on UserFields
}
}
}
fragment UserFields on User {
login
}
虽然除非您要处理抽象类型,否则基本上没有意义,但您也可以使用内联片段:
query {
system {
users {
...on User {
login
}
}
}
}
最后,您可以使用@skip
或@include
指令来更改实际解析的字段。可以跳过选择集中的所有字段,从而导致返回空对象。
query($someCondition: Boolean!, $someOtherCondition: Boolean) {
system {
users {
login @skip(if: $someCondition)
password @include(if: $someOtherCondition)
}
}
}
是否考虑这些不同查询取决于上下文。除了别名示例和指令示例外,所有这些都将导致与三个原始查询之一相同的响应。但是,所有这些示例在语义上都是不同的,最终将被解析为外观不同的AST。
编辑:GraphQL还支持introspection,因此如果在服务器上启用了自省功能,则以下类型的查询也将是“有效”的:
{
__type(name: "User") {
name
fields {
name
type {
name
}
}
}
}
{
__schema {
queryType {
name
fields {
name
}
}
}
}