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: как выбрать подход для вашего API

    GraphQL vs REST: как выбрать подход для вашего API

    Аватар автора GraphQL vs REST: как выбрать подход для вашего API

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

    Иконка календаря28 августа 2026
    GraphQLRESTAPIархитектураmiddleИконка уровня middle
    Картинка поста GraphQL vs REST: как выбрать подход для вашего API

    Введение

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

    Что такое REST

    REST (Representational State Transfer) — архитектурный стиль, где данные представлены в виде ресурсов, доступных по URL. Каждый ресурс поддерживает стандартный набор HTTP-методов.

    GET    /users/42
    GET    /users/42/posts
    POST   /posts
    PATCH  /posts/17
    DELETE /posts/17
    

    Сервер возвращает фиксированную структуру данных для каждого эндпоинта. Если клиенту нужны данные из нескольких ресурсов, приходится делать несколько запросов подряд.

    // получаем пользователя, а затем его посты отдельным запросом
    const user = await fetch('/users/42').then(r => r.json());
    const posts = await fetch(`/users/${user.id}/posts`).then(r => r.json());
    

    Что такое GraphQL

    GraphQL — язык запросов и рантайм, где клиент сам описывает, какие поля и связи ему нужны, а сервер отдаёт ответ ровно такой формы. Вместо множества эндпоинтов используется один вход (обычно /graphql).

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

    За один запрос клиент получает и пользователя, и его посты — без лишних round-trip'ов.

    // один запрос вместо двух отдельных
    const { data } = await fetch('/graphql', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ query: USER_WITH_POSTS, variables: { id: 42 } })
    }).then(r => r.json());
    

    Сравнение по критериям

    Over-fetching и under-fetching

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

    Количество запросов

    REST для связанных сущностей требует нескольких запросов (или создания специальных агрегирующих эндпоинтов). GraphQL агрегирует данные на уровне резолверов, отдавая всё за один HTTP-запрос.

    Кэширование

    REST отлично работает со стандартным HTTP-кэшированием: ETag, Cache-Control, CDN понимают URL-структуру из коробки. GraphQL обычно использует один POST-эндпоинт, поэтому HTTP-кэширование почти не работает — приходится кэшировать на уровне клиента (Apollo Client, Relay) или добавлять persisted queries.

    Версионирование

    REST версионируют через префиксы вроде /v1/, /v2/, что со временем приводит к дублированию кода. GraphQL эволюционирует без версий: новые поля добавляются, старые помечаются @deprecated, а схема остаётся единой.

    type User {
      name: String!
      # старое поле, оставлено для обратной совместимости
      fullName: String @deprecated(reason: "Используйте name")
    }
    

    Производительность бэкенда

    В REST легко оптимизировать конкретный эндпоинт под конкретный запрос к базе данных. В GraphQL произвольная вложенность полей может привести к проблеме N+1 запросов, если не использовать батчинг (например, DataLoader).

    // без батчинга — N+1 запросов к базе на каждый пост
    const loader = new DataLoader(async (ids) => {
      const users = await db.users.findByIds(ids);
      return ids.map(id => users.find(u => u.id === id));
    });
    

    Порог входа и инструментарий

    REST проще объяснить новому разработчику и проще отладить через curl или Postman. GraphQL требует понимания схемы, резолверов и типовой системы, зато даёт самодокументируемый API через интроспекцию и инструменты вроде GraphiQL.

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

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

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

    GraphQL оправдан, если у продукта несколько разных клиентов (веб, iOS, Android) с разными требованиями к данным, экраны часто меняются и состав нужных полей нестабилен, важно снизить количество запросов на мобильных сетях, а команда готова инвестировать в схему, резолверы и защиту от сложных запросов.

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

    Первая ошибка — выбирать GraphQL «потому что модно», без реальной потребности в гибких запросах: это добавляет сложность без выгоды.

    Вторая — игнорировать проблему N+1 в резолверах GraphQL, что приводит к деградации производительности под нагрузкой.

    Третья — пытаться сделать REST-эндпоинты «универсальными» через десятки query-параметров вместо того, чтобы признать: клиенту нужна гибкость, и это сигнал в пользу GraphQL.

    Четвёртая — не ограничивать глубину и сложность GraphQL-запросов, что открывает возможность для DoS через специально сконструированный тяжёлый запрос.

    // ограничение глубины запроса защищает сервер от чрезмерно вложенных query
    const depthLimit = require('graphql-depth-limit');
    const server = new ApolloServer({
      schema,
      validationRules: [depthLimit(5)]
    });
    

    Заключение

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

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

    Комментарии

    0

    Постройте личный план изучения CSS Flexbox - полный курс и практика его использования до уровня Middle — бесплатно!

    CSS Flexbox - полный курс и практика его использования — часть карты развития Frontend

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

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

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

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

    Основы JavaScript

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

    Продвинутый JavaScript

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

    TypeScript с нуля

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

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

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

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

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

    Иконка чипа0
    Иконка глаза244
    Иконка комментариев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
    Иконка глаза102
    Иконка комментариев0
    Иконка аватараАнтон
    Иконка календаря10 октября 2026
    AI-инструментыClaude CodeDevOps+ 2middleИконка уровня middle

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

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

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