Вы можете иметь любое количество игнорируемых токенов , таких как пробелы, разрывы строк и запятые, которые технически могут привести к различным документам.
За пределами изменения имени вашей операции (то есть SimpleQuery2
)Вы также можете использовать сокращенную форму запроса :
{
system {
users {
login
}
}
}
Порядок полей в ответе зависит от их порядка в запросе, поэтому эти два запроса будут давать разные ответы (посколькукасается порядка ключей):
query {
system {
users {
login
password
}
}
}
query {
system {
users {
password
login
}
}
}
У вас могут быть дубликаты полей, хотя дубликаты будут удалены в фактическом ответе:
query {
system {
users {
login
login
login
}
}
}
Но вы также можете использовать псевдонимы , чтобы сохранить дубликаты полей:
query {
system {
users {
login1: login
login2: login
login3: login
}
}
}
Ваш запрос может использовать один или несколько фрагментов :
query {
system {
users {
...on UserFields
}
}
}
fragment UserFields on User {
login
}
И хотя это в значительной степени бессмысленно, если только выПри работе с абстрактными типами вы также можете использовать встроенные фрагменты:
query {
system {
users {
...on User {
login
}
}
}
}
Наконец, вы можете использовать директивы @skip
или @include
для измененияwhich поля фактически разрешаются.Можно пропустить все поля в наборе выбора, в результате чего будет возвращен пустой объект.
query($someCondition: Boolean!, $someOtherCondition: Boolean) {
system {
users {
login @skip(if: $someCondition)
password @include(if: $someOtherCondition)
}
}
}
Считаете ли вы эти разные запросы, зависит от контекста.За исключением примера псевдонима и примера директив, все они приведут к тому же ответу, что и один из ваших трех исходных запросов.Тем не менее, все эти примеры семантически различны и в конечном итоге могут быть проанализированы в другой вид AST.
РЕДАКТИРОВАТЬ: GraphQL также поддерживает самоанализ , поэтому следующие типы запросов также будут "действительными"«при условии, что на сервере включен самоанализ:
{
__type(name: "User") {
name
fields {
name
type {
name
}
}
}
}
{
__schema {
queryType {
name
fields {
name
}
}
}
}