Skip to content

GraphQL Основы

Что такое GraphQL?

GraphQL (Graph Query Language) — это язык запросов и среда выполнения для API, разработанная Facebook в 2012 году и открытая публично в 2015 году.

Основные особенности

  • Типизированная схема — точное определение всех возможных данных
  • Запрашивайте ровно то, что нужно — клиент определяет структуру ответа
  • Одна точка входа — единый эндпоинт вместо множества маршрутов
  • Самодокументируемость — встроенный инструмент для изучения API
  • Сильная типизация — валидация данных на уровне схемы

GraphQL vs REST

АспектGraphQLREST
ЗапросыОдин запрос получает только нужные данныеЧасто избыточные данные (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.