GraphQL и REST: сравнение
↑ 5.4 Работа с API: REST, GraphQL, WebSocket · ← Предыдущая · → Следующая
Зачем это на собесе
Аргументированный выбор, а не «GraphQL современнее».
Объяснение
| Критерий | REST | GraphQL |
|---|---|---|
| Endpoint | много ресурсов | один /graphql |
| Форма ответа | фиксирована сервером | описывается клиентом |
| Over/under-fetching | возможны | нет |
| Количество запросов | несколько на экран | один |
| Типизация | OpenAPI (опционально) | строгая схема из коробки |
| Кэширование HTTP | нативное (GET, ETag, CDN) | сложно (POST) — persisted queries, клиентский кэш |
| Версионирование | версии API | эволюция схемы (@deprecated) |
| Ошибки | HTTP-коды | 200 + errors |
| Загрузка файлов | простая (multipart) | нестандартно |
| Реалтайм | SSE/WebSocket отдельно | subscriptions |
| Инструменты | Postman, OpenAPI | GraphiQL, Apollo Studio, codegen |
| Сложность сервера | ниже | выше (N+1, лимиты, безопасность) |
| Сложность клиента | ниже | выше (клиент, кэш, codegen) |
| Публичные API | стандарт | реже |
| Мобильные клиенты | лишний трафик | экономия |
Когда GraphQL: много разных клиентов (web/mobile) с разными потребностями данных; сложные связанные данные; быстрая итерация фронтенда; агрегация нескольких сервисов (federation).
Когда REST: простые CRUD, публичные API, кэширование на CDN, загрузка файлов, команда без опыта GraphQL, жёсткая простота эксплуатации.
Гибрид: REST для команд и файлов, GraphQL для чтения агрегатов; BFF; gRPC между сервисами.
Нюансы и подводные камни
- GraphQL не устраняет N+1 — он переносит её на сервер (DataLoader).
- Безопасность: лимиты глубины/сложности обязательны.
- «Один запрос» не значит «быстрый запрос».
- REST + OpenAPI + codegen закрывает большую часть преимуществ типизации.
Практика
- Сравните количество запросов экрана заказа в REST и GraphQL.
- Опишите критерии выбора для вашего проекта.
Вопросы с ответами
Когда REST предпочтительнее GraphQL?
Для простых CRUD, публичных и кэшируемых API, загрузки файлов и когда важна простота.
Основной плюс GraphQL для клиента?
Клиент сам определяет форму данных и получает нужное за один запрос.