GraphQL? — это язык запросов к API-интерфейсам. Он отображает предоставляемые сервером данные, чтобы клиент смог выбрать именно то, что ему нужно, не получая все данные.

Если кратко, то GraphQL — это синтаксис, который описывает как запрашивать данные, и, в основном, используется клиентом для загрузки данных с сервера. GraphQL имеет три основные характеристики:

  • Позволяет клиенту точно указать, какие данные ему нужны.
  • Облегчает агрегацию данных из нескольких источников.
  • Использует систему типов для описания данных.

Для использования GraphQL, установим пакет graphql с помощью команд:
yarn add graphql, если используете менеджер пакетов yarn
npm i graphql --save, для менеджера пакетов npm

Типы данных


GraphQL из коробки содержит набор стандартных скалярных типов:

  • Int?: целое число.
  • Float?: Подписанное число с плавающей точкой двойной точности.
  • String?: Строка в UTF-8.
  • Boolean?:true или false.
  • ID?: представляет уникальный идентификатор, обычно используемый для переполучения объекта или как ключ кеша. Тип ID сериализован так же, как String; однако, определение его как ID подразумевает, что он не должен быть распознан людьми.

Также имеется возможность создавать собственные типы с помощью ключевого слова type:

type User {
 id: ID!
 name: String!
 email: String
}

Перечисления (Enums)


Перечисления — особый вид скалярных типов, который может содержать только значение из определенного набора значений. Это позволяет вам:

  • Проверять, что любые аргументы этого типа содержат разрешенное значение
  • Сообщить через систему типов, что поле будет всегда содержать одно из конечного множества значений

Пример enums:

enums Roles {
    Admin
    User
}

Интерфейсы


Как и многие системы, GraphQL поддерживает интерфейсы. Интерфейс — это тип абстракции, который включает определенный набор полей, которые тип должен включить для внедрения интерфейса. Интерфейсы полезны, когда вы хотите вернуть объект или набор объектов, но они могут быть различных типов.

Пример интерфейса:

interface User {
 id: ID!
 name: String!
 email: String
}

Запросы(Queries)


Запросы GraphQL — это сущности, представляющие собой запрос к серверу на получение неких данных. За этими данными мы и обращаемся к серверу, выполняя запрос. При использовании традиционных REST API наш запрос принимает вид GET-запроса.

Пример запроса:

query { 
    allUsers {
        id					
        name 
    }						
} 

Мутации (Mutations)


Если запросы (queries) в GraphQL выполняют загрузку данных, мутации ответственны за внесение в данные изменений.

Пример мутации:

mutation createUser($name: String!, $email: String) { 
    createUser(name: $name,email: $email) {			
        id 
    }					
} 

Объединённые типы (Union)


Типы Union очень похожи на интерфейсы, но не определяют общие поля между типами.
Когда возвращается тип из нашей схемы, мы можем получить несколько типов. Отметим, что члены типа union должны быть конкретными типами объекта; вы не можете создать тип union из интерфейса или других union.

union Result = Admin | User

Типы ввода (Input type)


GraphQL также позволяет с легкостью передать целые объекты. Это полезно в частности в случае мутаций, где вы можете захотеть передать данные в целом объекте. В GraphQL schema, типы ввода выглядят точно так же, как регулярные типы объектов, но с ключевым словом input вместо type:

input User {
    name: String!
    email: String
}

Псевдонимы (Aliases)


GraphQL позволяет в одном запросе вызывать несколько 'запросов':

{
  admin: user(id: 1) {
    name
  }
  user: user(id: 2) {
    name
  }
}

Фрагменты (Fragments)


Чтобы не дублировать однотипные структуры в запросах в GraphQL используются фрагменты.

fragment userFields on User {
  name
  email
}

admin: user(id: 1) {
    ...userFields
}