GraphQL API
Одна типизированная точка входа, где клиент запрашивает ровно те данные, что ему нужны
/graphql, за которой стоит строго типизированная схема. Клиент отправляет запрос с описанием точного набора нужных полей, и сервер возвращает именно эту форму — ни больше, ни меньше. Вы уже строили REST API на Express; GraphQL — это другой контракт поверх тех же источников данных (SQL, MongoDB, другие сервисы), которые вы уже знаете.
- писать GraphQL-схему на SDL с объектными типами,
QueryиMutation; - реализовывать резолверы и читать их сигнатуру
(parent, args, context, info); - отличать запросы (чтение) от мутаций (запись) и формировать каждую операцию;
- распознавать проблему N+1 и объяснять, как DataLoader устраняет её батчингом;
- взвешивать честные компромиссы GraphQL и REST и выбирать осознанно.
1. Зачем нужен GraphQL: избыточная и недостаточная выборка
В REST API каждый эндпоинт возвращает фиксированный ответ. Представьте мобильный экран, которому нужны имя пользователя и заголовки трёх его последних постов. С REST вы часто оказываетесь перед двумя плохими вариантами:
- Избыточная выборка (over-fetching).
GET /users/42возвращает весь объект пользователя — email, адрес, настройки, метки времени — когда вам нужно было только имя. Байты тратятся впустую в каждом запросе. - Недостаточная выборка (under-fetching, лишние обращения). Этот эндпоинт не включает посты, поэтому клиент делает второй запрос
GET /users/42/posts. Два сетевых обращения ради одного экрана; чем больше экранов, тем больше болтовни по сети.
GraphQL убирает обе проблемы для клиента. Клиент отправляет один запрос с описанием ровно того дерева данных, которое ему нужно:
query {
user(id: 42) {
name
posts(last: 3) { title }
}
}
Сервер отвечает JSON-объектом, повторяющим ровно эту форму: user с полем name и массивом posts, у каждого из которых есть title — и больше ничего.
Аналогия. REST — это ресторан с фиксированным меню: каждое блюдо (эндпоинт) подаётся заранее оформленным, и если нужен гарнир — заказываете второе блюдо. GraphQL — это боул по вашему выбору: вы отмечаете ровно нужные ингредиенты в одном бланке заказа, и кухня собирает один боул. Кухня (ваши источники данных) не меняется; меняется только контракт заказа.
Важно: GraphQL не заменяет вашу базу данных или бизнес-логику. Под каждым полем — обычный код, который читает из Postgres, MongoDB, кэша или другого HTTP-сервиса — те самые навыки из предыдущих курсов.