Возможно, вам будет полезно просмотреть спецификацию , но ниже приведено несколько более короткое объяснение:
Что такое операция?
Есть три операции вGraphQL (query
, mutation
и subscription
).Как правило, запрос GraphQL состоит только из одной из этих трех операций и формирует корень запроса или точку входа в остальную часть схемы.
С каждой операцией связан отдельный тип объекта,По соглашению эти типы называются Query
, Mutation
и Subscription
, но их именование функционально не имеет отношения к вашей схеме.Кроме их связи с определенной операцией, в этих типах объектов нет ничего особенного - у каждого есть name
, description
и fields
, как и у любого другого типа объекта в вашей схеме.В совокупности мы называем эти три типа корневыми типами операций .
В вашем примере корневой тип query
имеет поле , называемое getBooks
.Это поле разрешается в соответствии с теми же правилами, что и любое другое поле в вашей схеме.Единственная особенность этого поля в том, что оно находится в корне - нет никакого родительского поля, которое было бы разрешено до него.
Имена операций являются необязательными, поскольку они не влияют на данные, возвращаемые сервером -- они обычно используются для целей отладки (хотя некоторые клиенты и инструменты используют их для предоставления других функций, поэтому всегда полезно иметь их).Однако необходимо указать хотя бы одно имя поля для вашего корневого типа операции, иначе ваша операция на самом деле ничего не сделает (т.е. запросит данные у сервера).Опять же, эти поля являются вашей точкой входа в остальную часть схемы и отправной точкой для вашего графа данных.
Хорошо, а как насчет переменных?
Согласно спецификации:
Переменные должны быть определены в верхней части операции и находятся в области действия во время выполнения этой операции.
Хотя мы не инициализируем переменную внутри документа значениемнам нужно определить его, сообщив GraphQL, какой это тип переменной.Это позволяет GraphQL затем проверять использование ваших переменных по всему документу.Например, если вы определите переменную как String
, а затем попытаетесь использовать ее в поле ввода, равном Int
, проверка завершится неудачно, и ваш запрос будет взорван еще до того, как он будет выполнен.
Переменные всегда определяются как часть определения операции - они могут использоваться в любом месте документа, хотя и несколько раз.Таким образом, здесь нет «двух уровней параметров» - одна строка - просто определение, другая - использование.
Слово о семантике
Даже если у нас есть спецификация,Язык вокруг GraphQL эволюционировал после обозначенных в нем терминов.Термин «запрос» имеет несколько значений, с которыми вы можете столкнуться при просмотре различных документов и статей.Помните об этих определениях, чтобы не запутаться:
- По соглашению мы называем тип корневой операции, связанный с операцией
query
, типом Query
* - Неформальнополя в этом
Query
(то есть getBooks
), которые часто называют «запросами» вашей схемы (точно так же, как поля типа Mutation
часто называют «мутациями» вашей схемы. - Полная строка запроса, которую мы отправляем на сервер, которая включает всю операцию и любые соответствующие фрагменты официально называется документом . Однако,мы часто называем запрос запросом к серверу . Это приводит к тому, что сам документ часто называют запросом, независимо от того, содержит ли операция на самом деле
query
или другую операцию, например mutation
.