GraphQL Основы
Что такое GraphQL?
GraphQL (Graph Query Language) — это язык запросов и среда выполнения для API, разработанная Facebook в 2012 году и открытая публично в 2015 году.
Основные особенности
- Типизированная схема — точное определение всех возможных данных
- Запрашивайте ровно то, что нужно — клиент определяет структуру ответа
- Одна точка входа — единый эндпоинт вместо множества маршрутов
- Самодокументируемость — встроенный инструмент для изучения API
- Сильная типизация — валидация данных на уровне схемы
GraphQL vs REST
| Аспект | GraphQL | REST |
|---|---|---|
| Запросы | Один запрос получает только нужные данные | Часто избыточные данные (over-fetching) |
| Множество ресурсов | Один запрос для связанных данных | Несколько запросов (under-fetching) |
| Версионирование | Не требуется | v1, v2, v3... |
| Кеширование | Сложнее (все через POST) | Простое (HTTP кеширование) |
| Обучение | Крутая кривая обучения | Проще для новичков |
Основные концепции
Query (Запрос)
Получение данных. Как GET в REST.
graphql
query {
user(id: "1") {
id
name
email
}
}Mutation (Мутация)
Изменение данных. Как POST/PUT/DELETE в REST.
graphql
mutation {
createUser(name: "John", email: "john@example.com") {
id
name
}
}Subscription (Подписка)
Получение обновлений в реальном времени через WebSocket.
graphql
subscription {
userCreated {
id
name
}
}Структура GraphQL сервера
┌─────────────────┐
│ GraphQL Query │
└────────┬────────┘
│
┌────────▼──────────────┐
│ GraphQL Validation │
└────────┬──────────────┘
│
┌────────▼──────────────┐
│ Query Execution │
└────────┬──────────────┘
│
┌────────▼──────────────┐
│ Resolvers │
└────────┬──────────────┘
│
┌────────▼──────────────┐
│ Data Sources │
│ (БД, API, и т.д) │
└──────────────────────┘Основные инструменты
- Apollo Server — Node.js сервер
- Apollo Client — JavaScript клиент
- GraphQL Yoga — простой и легкий сервер
- Relay — Facebook библиотека для клиента
- GraphQL Inspector — инструмент для анализа схем
Первый GraphQL сервер (Apollo Server)
typescript
import { ApolloServer, gql } from 'apollo-server';
// Определяем типы
const typeDefs = gql`
type Query {
hello: String
user(id: ID!): User
}
type User {
id: ID!
name: String!
email: String!
}
`;
// Определяем резолверы
const resolvers = {
Query: {
hello: () => 'Привет, мир!',
user: (_, { id }) => ({
id,
name: 'John Doe',
email: 'john@example.com'
})
}
};
const server = new ApolloServer({
typeDefs,
resolvers
});
server.listen({ port: 4000 });Преимущества GraphQL
✅ Точное получение данных — нет over-fetching/under-fetching ✅ Разработка быстрее — одна точка входа ✅ Легко масштабировать — модульная архитектура ✅ Инструменты разработки — встроенные GraphiQL, Apollo DevTools ✅ Типизация — автоматическая валидация
Недостатки GraphQL
❌ Сложнее, чем REST для простых случаев ❌ Кеширование сложнее ❌ Требует обучения ❌ N+1 проблема в запросах ❌ Возможны большие payload при неправильном запросе
Когда использовать GraphQL
- 🟢 Много клиентов с разными потребностями в данных
- 🟢 Мобильное приложение (экономия трафика)
- 🟢 Быстро меняющиеся требования
- 🟢 Микросервисная архитектура
Когда использовать REST
- 🟢 Простой CRUD API
- 🟢 Высокие требования к кешированию
- 🟢 Малая команда с простыми потребностями
- 🟢 Максимальная производительность критична
Дальше
Изучите Queries для глубокого понимания запросов в GraphQL.