GraphQL на сервере: схема, типы, resolvers
↑ 5.3 GraphQL на бэкенде и Federation · → Следующая
Зачем это на собесе
Ждут понимания, чем GraphQL отличается от REST и где он оправдан.
Объяснение
GraphQL — язык запросов и рантайм: клиент сам описывает нужную форму данных, сервер отвечает ровно ей через один endpoint (POST /graphql).
type Query { order(id: ID!): Order orders(first: Int, after: String): OrderConnection! }
type Mutation { cancelOrder(id: ID!): Order! }
type Subscription { orderUpdated(id: ID!): Order! }
type Order { id: ID! number: String! customer: Customer! items: [Item!]! total: Decimal! }| Понятие | Смысл |
|---|---|
| Schema | строго типизированный контракт |
| Query / Mutation / Subscription | чтение / изменение / поток событий |
| Resolver | функция, получающая значение поля |
| Scalar, Enum, Interface, Union, Input | типы |
Клиент запрашивает только нужное:
query { order(id: "42") { number customer { name } items { title price } } }| Плюсы | Минусы |
|---|---|
| нет over/under-fetching | сложнее кэширование HTTP |
| один запрос вместо нескольких | N+1 в resolvers |
| самодокументируемая схема | нужны лимиты сложности |
| удобно для разных клиентов (web, mobile) | больше инфраструктуры |
Resolvers выполняются на каждом поле: поле customer вызовет свой resolver для каждого заказа — источник N+1 (см. Проблема N+1 и DataLoader).
Нюансы и подводные камни
- Всегда 200 OK: ошибки лежат в поле
errors, а не в HTTP-статусе. - Схема — публичный контракт: устаревшие поля помечайте
@deprecated, не удаляйте. - Не отдавайте сущности БД как есть: проектируйте схему вокруг клиентов.
- Авторизация — на уровне полей и типов, а не только endpoint.
- GraphQL не заменяет REST везде: для простых CRUD и публичных API REST проще.
Практика
- Опишите схему магазина и запросите вложенные данные одним запросом.
- Найдите N+1 в логах SQL.
- Сравните число запросов клиента для REST и GraphQL на экране заказа.
Вопросы с ответами
Чем GraphQL отличается от REST?
Один endpoint и клиентское описание формы ответа против набора ресурсов с фиксированными представлениями.
Что такое resolver?
Функция, вычисляющая значение конкретного поля схемы.
Почему в GraphQL всегда 200?
Транспорт и результат разделены: частичные данные и список
errorsвозвращаются вместе.