Возможные допустимые запросы для простой схемы GraphQL - PullRequest
1 голос
/ 08 июня 2019

Я хотел подтвердить, правильно ли я понимаю схему 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 Ответ

1 голос
/ 08 июня 2019

Вы можете иметь любое количество игнорируемых токенов , таких как пробелы, разрывы строк и запятые, которые технически могут привести к различным документам.

За пределами изменения имени вашей операции (то есть 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
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...