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, измерьте эффект на одном экране и масштабируйте подход, опираясь на реальные метрики, а не на хайп.

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

    Комментарии

    0

    Постройте личный план изучения JavaScript Advanced - продвинутые концепции языка и ООП до уровня Middle — бесплатно!

    JavaScript Advanced - продвинутые концепции языка и ООП — часть карты развития Frontend, Backend, Mobile

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

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

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

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

    TypeScript с нуля

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

    React и Redux Toolkit

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

    Neovim

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

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

    Картинка поста HTTP методы GET POST PUT DELETE: разница и применение
    Иконка аватараАнтон
    Иконка календаря27 июня 2026
    HTTPRESTAPI+ 2juniorИконка уровня junior

    HTTP методы GET POST PUT DELETE: разница и применение

    HTTP методы GET, POST, PUT, DELETE — основа любого REST API. Разбираем, чем они отличаются, когда применять каждый и какие ошибки допускают новички.

    Иконка чипа0
    Иконка глаза437
    Иконка комментариев0
    Картинка поста Основы Docker для разработчика: контейнеры, образы и тома
    Иконка аватараАнтон
    Иконка календаря20 июня 2026
    DockerDevOpsКонтейнеризация+ 1juniorИконка уровня junior

    Основы Docker для разработчика: контейнеры, образы и тома

    Основы Docker для разработчика: разбираем, что такое контейнеры, образы и тома, как их создавать и использовать в реальных проектах.

    Иконка чипа0
    Иконка глаза234
    Иконка комментариев0
    Картинка поста Kafka и Node.js: Event-Driven архитектура на практике
    Иконка аватараАнтон
    Иконка календаря13 июля 2026
    kafkanodejsevent-driven+ 2seniorИконка уровня senior

    Kafka и Node.js: Event-Driven архитектура на практике

    Event-Driven архитектура с Kafka в Node.js: продюсеры, консьюмеры, гарантии доставки и типичные ошибки на реальных примерах.

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