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

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

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

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

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

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

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

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

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

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
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 не является допустимым типом операции.

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