Почему запрос GraphQL работает с ключевым словом «query» перед фигурными скобками? - PullRequest
1 голос
/ 22 мая 2019

В качестве примера я создал небольшой API для авторов и книг.Проблема в том, что я не понимаю, почему запрос может выглядеть по-другому, но все равно дает мне тот же результат.Я включил 3 примера.

Запрос GraphQL выглядит следующим образом:

{ 
 "query":
  "query{
  author(id: 1) {
    name
  }
 }"
}

Почему этот запрос работает, если в запросе ключевое слово "query" два раза?Когда я пишу запрос так:

{ 
 "query":
  "{
  author(id: 1) {
    name
  }
 }"
}

, он тоже работает, а когда я пишу так:

{ 
 "query":
  "author{
  author(id: 1) {
    name
  }
 }"
}

Это не работает.Почему это так?

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

GraphQL определяет три типа операций :

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

То, что вы отправляете на свой сервер, - это объект JSON с одним свойством (query), значением которого является GraphQL документ , который представляет ваш фактический запрос к службе GraphQL. Это свойство (к сожалению) называется query по соглашению , но оно не имеет ничего общего с фактической операцией внутри документа, который вы отправляете .

Любая операция, включенная в документ GraphQL, должна иметь следующий формат:

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

Name, VariableDefinitions и Directives являются необязательными. OperationType является одним из query, mutation или subscription. SelectionSet - это набор полей, которые вы запрашиваете для этого типа операции. Только фигурные наборы заключены в фигурные скобки. В вашем примере у вас есть два набора выборок - один содержит поле author, а другой - поле name.

Существует исключение из названного сокращения запроса :

Если документ содержит только одну операцию запроса, и этот запрос не содержит переменных и не содержит директив, эта операция может быть представлена ​​в сокращенной форме, в которой отсутствуют ключевое слово и имя запроса.

Другими словами, если ваша операция:

  • это запрос
  • является единственной операцией в документе
  • не содержит определения переменных или директив

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

Итак, ваши первые два примера одинаково верны. Третий пример недопустим, потому что author не является допустимым видом операции.

1 голос
/ 22 мая 2019

Первый ключ query в ваших примерах является требованием от GraphQL для фактического вызова конечной точки, он должен присутствовать для фактического запуска queries или mutations.Вы можете увидеть это в документах .

. Первый пример работает, потому что в корне схемы GraphQL должно быть действие с ключевыми словами query или mutation, а вВ вашем случае вы запускаете query.

. Второй пример работает, потому что если вы не определили, какой тип действия (query или mutation) по вашему запросу, он всегда по умолчанию выполняетquery.

Третий пример не работает, потому что у вас нет действия author в корне вашей схемы.

Я думаю, первое ключевое слово queryчто делает некоторую путаницу в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...