Почему запрос GraphQL работает с ключевым словом «запрос» перед фигурными скобками?

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

Запрос GraphQL выглядит так:

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
348
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

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

Ответ принят как подходящий

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

  • query – a read‐only fetch.
  • mutation – a write followed by a fetch.
  • subscription – a long‐lived request that fetches data in response to source events.

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

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

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

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

Существует исключение из приведенного выше, называемое стенограмма запроса:

If a document contains only one query operation, and that query defines no variables and contains no directives, that operation may be represented in a short‐hand form which omits the query keyword and query name.

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

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

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

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

Другие вопросы по теме