PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    GraphQL vs REST: когда что выбирать и как перейти

    GraphQL vs REST: когда что выбирать и как перейти

    Аватар автора GraphQL vs REST: когда что выбирать и как перейти

    Антон Ларичев

    Иконка календаря29 мая 2026
    GraphQLRESTAPIBackendmiddleИконка уровня middle
    Картинка поста GraphQL vs REST: когда что выбирать и как перейти

    Введение

    Выбор между GraphQL и REST — один из ключевых архитектурных вопросов при проектировании современного API. REST доминировал последнее десятилетие благодаря простоте и стандартизации, но GraphQL предложил гибкий подход к работе с данными, где клиент сам решает, что ему нужно. В этой статье разберём сильные и слабые стороны обоих подходов, покажем примеры кода и сформулируем стратегию миграции с REST на GraphQL.

    Ключевые различия

    REST построен вокруг ресурсов и HTTP-методов: каждый endpoint возвращает фиксированную структуру данных. GraphQL — это единая точка входа, где клиент описывает запрос на специальном языке схем.

    Пример REST-запроса для получения пользователя и его постов:

    GET /api/users/42
    GET /api/users/42/posts
    

    Клиент делает два отдельных запроса и получает все поля, даже если нужны только имя и заголовки постов. В GraphQL тот же сценарий выглядит компактнее:

    query {
      user(id: 42) {
        name
        posts {
          title
        }
      }
    }
    

    Один запрос — точные данные, без избыточности и без серии round-trip к серверу.

    Когда выбирать REST

    REST остаётся отличным выбором, если у вас простая ресурсная модель, публичный API с кэшированием через CDN или команда, которой важна предсказуемость и низкий порог входа. HTTP-кэширование работает из коробки: достаточно правильно настроить заголовки.

    // Простой REST-обработчик на Express
    import express from 'express';
    
    const app = express();
    
    app.get('/api/users/:id', async (req, res) => {
      const user = await db.users.findById(req.params.id);
      // Кэшируем ответ на 60 секунд через стандартный HTTP-механизм
      res.set('Cache-Control', 'public, max-age=60');
      res.json(user);
    });
    

    REST также проще отлаживать: curl, Postman и логи nginx показывают всё, что нужно. Для микросервисов с чёткими границами это часто оптимальный вариант.

    Когда выбирать GraphQL

    GraphQL раскрывается на проектах с богатыми клиентами: мобильные приложения, дашборды, сложные SPA. Если у вас десятки экранов с разными требованиями к данным, GraphQL избавит от endpoint-зоопарка вида /users/me/short, /users/me/full, /users/me/with-stats.

    Пример резолвера на Apollo Server:

    import { ApolloServer } from '@apollo/server';
    
    const typeDefs = `
      type User {
        id: ID!
        name: String!
        posts: [Post!]!
      }
      type Post {
        id: ID!
        title: String!
      }
      type Query {
        user(id: ID!): User
      }
    `;
    
    const resolvers = {
      Query: {
        // Резолвер запрашивает только верхний уровень — посты подгрузятся отдельно
        user: (_, { id }) => db.users.findById(id),
      },
      User: {
        posts: (parent) => db.posts.findByUserId(parent.id),
      },
    };
    

    Клиенту больше не нужно знать о структуре бэкенда — он описывает форму ответа и получает ровно её.

    Стратегия перехода с REST на GraphQL

    Полная миграция за один релиз почти всегда плохая идея. Практичный путь — постепенное внедрение GraphQL-слоя поверх существующего REST.

    Шаг 1. Поднимаем GraphQL как фасад над REST-сервисами:

    const resolvers = {
      Query: {
        user: async (_, { id }) => {
          // Внутри резолвера ходим в старый REST-endpoint
          const response = await fetch(`https://api.internal/users/${id}`);
          return response.json();
        },
      },
    };
    

    Шаг 2. Переводим один экран клиента на GraphQL и измеряем эффект — latency, количество запросов, объём передаваемых данных.

    Шаг 3. Постепенно переносим бизнес-логику из REST-контроллеров в GraphQL-резолверы, оставляя REST только для внешних потребителей или legacy-клиентов.

    Шаг 4. Когда покрытие достигает ~80%, переоцениваем: возможно, REST уже не нужен, либо он становится узким техническим слоем для интеграций.

    Частые ошибки

    Первая ошибка — переносить REST-мышление в GraphQL: создавать резолверы вида getUserById, getUserByEmail, getUserWithPosts. GraphQL предполагает декларативную схему, а не набор процедур.

    Вторая — игнорировать проблему N+1. Наивный резолвер User.posts сделает отдельный запрос к БД на каждого пользователя. Решение — DataLoader:

    import DataLoader from 'dataloader';
    
    const postsLoader = new DataLoader(async (userIds: readonly string[]) => {
      // Один запрос за всеми постами вместо N отдельных
      const posts = await db.posts.findByUserIds([...userIds]);
      return userIds.map((id) => posts.filter((p) => p.userId === id));
    });
    

    Третья — отсутствие лимитов на глубину и сложность запроса. Без них клиент может запросить дерево из 10 вложенных уровней и положить сервер. Используйте graphql-depth-limit или query complexity analysis.

    Четвёртая — слепо доверять кэшированию. В отличие от REST, GraphQL обычно ходит через POST, и стандартное HTTP-кэширование не работает. Понадобятся persisted queries или Automatic Persisted Queries (APQ).

    Заключение

    GraphQL и REST — не конкуренты, а инструменты для разных задач. REST остаётся надёжным выбором для простых ресурсных API и публичных сервисов с агрессивным кэшированием. GraphQL побеждает там, где клиенты разнообразны, требования к данным меняются часто, а количество endpoint-ов выходит из-под контроля. Переходить стоит постепенно: начните с фасада над REST, измерьте эффект на одном экране и масштабируйте подход, опираясь на реальные метрики, а не на хайп.

    Иконка глаза499

    Комментарии

    0

    Постройте личный план изучения Next.js 15 - с нуля, React TypeScript, Hooks, SSR и CSS Grid до уровня Middle — бесплатно!

    Next.js 15 - с нуля, React TypeScript, Hooks, SSR и CSS Grid — часть карты развития Frontend

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Vue 3 и Pinia

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Nuxt

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга5.0
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Feature-Sliced Design

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.6
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Микросервисная архитектура для начинающих: гайд с примерами
    Иконка аватараАнтон
    Иконка календаря23 сентября 2026
    микросервисыархитектураbackend+ 2juniorИконка уровня junior

    Микросервисная архитектура для начинающих: гайд с примерами

    Микросервисная архитектура простыми словами: чем она отличается от монолита, какие есть плюсы и минусы, и как спроектировать первую систему на микросервисах — с примерами кода.

    Иконка чипа0
    Иконка глаза240
    Иконка комментариев0
    Картинка поста CLAUDE.md: как написать инструкции для Claude Code
    Иконка аватараАнтон
    Иконка календаря11 октября 2026
    AI-инструментыClaude CodeDevOps+ 1middleИконка уровня middle

    CLAUDE.md: как написать инструкции для Claude Code

    CLAUDE.md — это файл с инструкциями по проекту, который Claude Code читает в начале каждой сессии. Положите его в корень репозитория и опишите внутри, чем проект собирается, чем запускаются тесты и каких соглашений держаться в коде. После этого агент перестанет спрашивать одно и то же в каждом новом диалоге и предлагать решения, которые в вашей кодовой базе не приняты. Формат предельно простой: обычный Markdown, обязательных полей нет, заголовки любые. Дальше — где именно создавать файл и как Claude Code собирает инструкции сразу из нескольких мест, что писать внутрь, как подключать к файлу другие документы и чем CLAUDE.md отличается от AGENTS.md. Одна оговорка перед началом: Claude Code обновляется часто, набор команд и поддерживаемых файлов пополняется. Если какая-то деталь ниже ведёт себя у вас иначе, сверяйтесь с документацией той версии, которая стоит у вас.

    Иконка чипа0
    Иконка глаза56
    Иконка комментариев0
    Иконка аватараАнтон
    Иконка календаря10 октября 2026
    AI-инструментыClaude CodeDevOps+ 2middleИконка уровня middle

    Агенты в OpenCode: как создать своего агента

    Агент в OpenCode — это именованный профиль работы: своя модель, свой системный промпт и свой список разрешённых инструментов. Чтобы создать своего агента, нужно описать его отдельным markdown-файлом в папке `.opencode/agent/` внутри проекта (или в `~/.config/opencode/agent/`, если агент нужен во всех проектах) либо объявить его в блоке `agent` файла `opencode.json`. После этого агент появляется в списке доступных, и его можно вызвать прямо в сессии.

    Иконка чипа0
    Иконка глаза123
    Иконка комментариев0
    Иконка чипа0