简单GraphQL模式的可能有效查询

时间:2019-06-08 09:50:53

标签: graphql schema

我想确认我是否正确理解了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
        }
      }
    }

就是这样,没有其他可能的查询了?

1 个答案:

答案 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
      }
    }
  }
}