Язык GraphQL¶
Для практики будем использовать API GitHub
GraphQL не работает с одинарными кавычками.
Ошибки в ответе¶
В отличие от REST в GraphQL не используются ответы с кодами в случае возникновения ошибок (404 etc.). Для описания ошибки используется свойство errors
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Редактор GraphiQL¶
Мы будем работать с GraphQL посредством редактора GraphiQL.
GraphiQL 'понимает' какие поля доступны для запроса - нажмите ctrl + space.
Запрос через GraphiQL¶
В запросе ключевое слово query
необязательно, если запрос один.
1 2 3 4 5 |
|
эквивалентно
1 2 3 4 5 |
|
Результат:
1 2 3 4 5 6 7 |
|
Вложенные запросы¶
Вложенные свойства указываются как вложенные свойства в JSON-объекте.
1 2 3 4 5 6 7 8 |
|
Вложенный запрос с аргументом и его значением¶
У свойств могут быть аргументы - они указываются в скобках как пара (ключ: значение).
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 |
|
Результат
1 2 3 4 5 6 7 |
|
Алиасы¶
GraphQL позволяет в одном запросе вызывать несколько 'запросов':
1 2 3 4 5 6 7 8 9 10 |
|
Но в JSON свойства должны быть уникальны в рамках одного объекта (то есть в данном ожидается, что вернется 2 одинаковых свойства - repository
).
Данную проблему решают алиасы. Например, в нашем примере test
это свойство, которое придет в ответе при запросе на test: repository(...
.
1 2 3 4 5 6 7 8 9 |
|
Ответ:
1 2 3 4 5 6 7 8 9 10 |
|
Фрагменты¶
Чтобы не дублировать однотипные структуры в запросах (см. пример ниже) в GraphQL есть фрагменты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Фрагмент указывается через ключевое слово fragment
далее идет название фрагмента
, затем идет тип фрагмента (on тип-данных)
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Названия запросов¶
Запросу можно указать название. Для обозначения наименования запроса после ключевого слова query
ставится имя запроса. Это удобно для отладки на стороне сервера.
1 2 3 4 5 6 7 8 9 |
|
Переменные¶
Запросы в GraphQL могут принимать аргументы (по аналогии с обычными функциями javascript), и за это в GraphQL отвечают переменные. Для определения переменных используется знак $
.
Через :
указывается тип данных переменной.
!
указывает, что переменная обязательна.
В редакторе GrapihQL внизу есть окошко (QUERY VARIABLES
), где указываются значения для переменных. При этом переменные указываются в JSON-формате.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Ответ:
1 2 3 4 |
|
В post-запросе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Еще один пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
get-запрос:
1 2 3 4 |
|
Директивы¶
Директива используется в GraphQL в двух случаях:
- Хотим ли мы возвращать некоторое значение или нет по условию (
@include
). - Для того чтобы пропустить какое-либо значение (
@skip
).
Например, объявим переменную includeForks
, которая будет отвечать за то, следует ли включать свойство forks
в запрос или нет. И применим ее в директиве @include
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Документация схемы¶
Документация схемы - в редакторе GrapiQL есть вкладка Docs
, в которой прописаны типы, которые мы можем использовать.
При клике на Query
мы увидим все доступные запросы с описанием всех типов, доступных переменных и т. д. которые используются в запросе.
При этом документация генерируется автоматически.