Загрузка…
Загрузка…
GraphQL — схема + resolvers: клиент описывает нужные поля одним POST, сервер обходит дерево и вызывает resolver на каждое поле. Сила и ловушка — composability и N+1.
Schema + resolvers. Типы и поля в Schema Definition Language; у каждого поля — resolver, функция, возвращающая значение. Запрос выполняется обходом дерева. Executor вызывает resolvers per-field, per-item.
Три типа операций: query (чтение, как GET), mutation (запись, serially), subscription (live stream через WebSocket).
Всё — 200 POST. GraphQL обычно на одном POST /graphql; ошибки тоже приходят 200 OK с массивом errors. Partial success — норма: часть data и часть errors в одном ответе. HTTP-кэширование (CDN, browser) из коробки не работает — каждый запрос одинаковый opaque POST.
N+1 — defining gotcha. Запрос 100 users и company каждого. Наивный executor вызывает resolver company 100 раз — hit в БД на пользователя. Fix — DataLoader: батчит 100 load(companyId) в один tick в SELECT ... WHERE id IN (...), кэширует в рамках request. Без DataLoader GraphQL меняет over-fetching REST на resolver-level query storm.
Кэш на клиенте. Нет URL-based HTTP cache — клиенты (Apollo, urql, Relay) держат normalised cache по type + id. Fetch User:7 в одном query обновляет везде. Мощнее HTTP cache для rich app — но это ваша инфраструктура, не CDN.
Security surface. Клиент может запросить глубоко вложенный дорогой граф. Нужны query depth limiting, complexity analysis, persisted queries — REST такого не требовал, потому что shape фиксировал сервер.
GraphQL = один endpoint и точный shape от клиента; без DataLoader, лимитов глубины и persisted queries получите N+1 и DoS-вектор.
