简单 GraphQL 模式的可能有效查询
Possible valid queries for simple 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
}
}
}
仅此而已,没有其他可能的查询吗?
您可以有任意数量的 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
or @include
指令来改变实际解析的字段。可以跳过选择集中的所有字段,从而导致返回空对象。
query($someCondition: Boolean!, $someOtherCondition: Boolean) {
system {
users {
login @skip(if: $someCondition)
password @include(if: $someOtherCondition)
}
}
}
您是否考虑这些不同 查询取决于上下文。除了别名示例和指令示例之外,所有这些都会产生与您的三个原始查询之一相同的响应。然而,所有这些例子在语义上都是不同的,最终会被解析成不同的 AST。
编辑:GraphQL 还支持 introspection,因此如果在服务器上启用自省,以下类型的查询也将 "valid":
{
__type(name: "User") {
name
fields {
name
type {
name
}
}
}
}
{
__schema {
queryType {
name
fields {
name
}
}
}
}
我想确认我是否正确理解了 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
}
}
}
仅此而已,没有其他可能的查询吗?
您可以有任意数量的 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
or @include
指令来改变实际解析的字段。可以跳过选择集中的所有字段,从而导致返回空对象。
query($someCondition: Boolean!, $someOtherCondition: Boolean) {
system {
users {
login @skip(if: $someCondition)
password @include(if: $someOtherCondition)
}
}
}
您是否考虑这些不同 查询取决于上下文。除了别名示例和指令示例之外,所有这些都会产生与您的三个原始查询之一相同的响应。然而,所有这些例子在语义上都是不同的,最终会被解析成不同的 AST。
编辑:GraphQL 还支持 introspection,因此如果在服务器上启用自省,以下类型的查询也将 "valid":
{
__type(name: "User") {
name
fields {
name
type {
name
}
}
}
}
{
__schema {
queryType {
name
fields {
name
}
}
}
}