В качестве примера я создал небольшой API для авторов и книг. Проблема в том, что я не понимаю, почему запрос может выглядеть по-разному, но при этом получать тот же результат. Я включил 3 примера.
Запрос GraphQL выглядит так:
{
"query":
"query{
author(id: 1) {
name
}
}"
}
Почему этот запрос работает, если в запросе два раза встречается ключевое слово «запрос»? Когда я пишу запрос следующим образом:
{
"query":
"{
author(id: 1) {
name
}
}"
}
это тоже работает, и когда я пишу это так:
{
"query":
"author{
author(id: 1) {
name
}
}"
}
Это не работает. Почему это так?





Первый ключ 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 не является допустимым типом операции.