Перейти к содержимому

1. Что такое GraphQL

Что такое GraphQL

GraphQL — это язык запросов для API и среда выполнения этих запросов. Разработан в Facebook в 2012 году, открыт в 2015-м. Сегодня его используют GitHub, Twitter, Shopify, Airbnb и тысячи других компаний.

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

Окно терминала
GET /users/123 # получаем пользователя
GET /users/123/posts # получаем все посты (их может быть 500!)

Проблемы:

  • Overfetching/users/123 возвращает 30 полей, нужно только 2
  • Underfetching — нужно 2 запроса вместо одного
  • Версионирование/api/v1/, /api/v2/ — боль при изменениях
query {
user(id: "123") {
name
avatar
posts(limit: 3) {
title
createdAt
}
}
}

Получаешь ровно то, что запросил:

{
"data": {
"user": {
"name": "Алексей",
"avatar": "https://cdn.example.com/avatar.jpg",
"posts": [
{ "title": "Мой первый пост", "createdAt": "2026-01-01" },
{ "title": "GraphQL — огонь!", "createdAt": "2026-01-15" },
{ "title": "TypeScript tips", "createdAt": "2026-02-01" }
]
}
}
}
ОперацияREST-аналогНазначение
queryGETПолучение данных
mutationPOST/PUT/DELETEИзменение данных
subscriptionWebSocketReal-time обновления
Клиент → HTTP POST → GraphQL сервер → Resolvers → БД/API
Схема (Schema)
(типы + валидация)
  1. Клиент отправляет запрос на единственный endpoint (/graphql)
  2. Сервер валидирует запрос против схемы
  3. Resolver — функция, которая знает, как получить данные для каждого поля
  4. Ответ — только запрошенные данные в формате JSON
REST: /users, /posts, /comments, /likes, /notifications...
GraphQL: /graphql ← всё здесь
type User {
id: ID!
name: String!
email: String!
age: Int
posts: [Post!]!
}

Схема — это контракт между клиентом и сервером. Клиент всегда знает, какие поля доступны и какого типа.

GraphQL умеет сам себя документировать:

query {
__schema {
types {
name
fields {
name
type {
name
}
}
}
}
}

GraphiQL и Apollo Studio используют это для автодополнения и документации.

В REST при изменении API нужна новая версия. В GraphQL просто добавляешь новые поля — старые клиенты продолжают работать, новые используют новые поля.

type User {
id: ID!
name: String!
email: String!
# Новые поля не ломают старых клиентов:
phoneNumber: String
twoFactorEnabled: Boolean
}

Хорошо подходит:

  • Сложные данные с множеством связей
  • Несколько клиентов (web, mobile, desktop) с разными нуждами
  • Быстро меняющийся продукт
  • Публичный API для разработчиков

Может быть лишним:

  • Простые CRUD операции
  • Файловые операции (загрузка файлов — через REST лучше)
  • Маленький проект без сложных связей
  1. Зайди на https://studio.apollographql.com/sandbox — бесплатная GraphQL площадка
  2. Попробуй публичный GraphQL API: https://countries.trevorblades.com/graphql
  3. Запроси список стран:
query {
countries {
name
code
capital
currency
}
}
  • GraphQL — язык запросов и спецификация для API
  • Решает overfetching и underfetching из REST
  • Один endpoint /graphql вместо множества routes
  • Строгая типизация — схема как контракт
  • Три операции: query, mutation, subscription

Следующий урокУстановка Apollo Server и Client →