Язык 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 мы увидим все доступные запросы с описанием всех типов, доступных переменных и т. д. которые используются в запросе.
При этом документация генерируется автоматически.