Практики разработки ПО → Сетевые технологии → REST
Основная идея
REST (Representational State Transfer) — это архитектурный стиль для построения веб-сервисов, основанный на работе с ресурсами через стандартные HTTP-методы. REST делает API предсказуемым, масштабируемым и простым для понимания.
Ключевые аспекты
Ресурсы — всё является ресурсом (пользователи, товары, заказы), каждый идентифицируется уникальным URI
HTTP-методы — GET (чтение), POST (создание), PUT/PATCH (обновление), DELETE (удаление)
Stateless — сервер не хранит состояние клиента между запросами
Единый интерфейс — стандартизированный способ взаимодействия с ресурсами
Кэшируемость — ответы могут кэшироваться для повышения производительности
Плюсы REST
Простота понимания и использования
Масштабируемость благодаря stateless-архитектуре
Хорошая совместимость с HTTP-инфраструктурой (кэши, прокси)
Независимость клиента и сервера
Минусы REST
Избыточность данных (over-fetching/under-fetching)
Нет встроенной типизации контракта
Сложность версионирования API
Частые ошибки на собеседованиях
Путают REST с конкретным форматом данных (JSON) — REST не привязан к формату
Считают, что любой HTTP API — это REST (REST требует соблюдения ограничений)
Забывают о семантике HTTP-методов и статус-кодов
Не понимают разницу между PUT (полная замена) и PATCH (частичное обновление)
Введение и проблематика
REST (Representational State Transfer) — это архитектурный стиль для построения распределённых систем, предложенный Роем Филдингом в 2000 году в его докторской диссертации. REST определяет набор ограничений, которые делают веб-сервисы масштабируемыми, надёжными и простыми для понимания.
REST — это не протокол и не стандарт, а архитектурный стиль. Он описывает принципы проектирования, а не конкретную реализацию.
Какую проблему решает REST?
До появления REST веб-сервисы строились по разным принципам, что приводило к проблемам:
Сложность интеграции — каждый сервис имел уникальный интерфейс
Низкая масштабируемость — серверы хранили состояние клиентов
Отсутствие стандартов — разработчикам приходилось изучать каждый API с нуля
REST предложил унифицированный подход, основанный на уже существующих стандартах HTTP.
Базовая теория
Ресурсы — основа REST
В REST всё является ресурсом. Ресурс — это любая именованная сущность: пользователь, товар, заказ, статья. Каждый ресурс идентифицируется уникальным URI (Uniform Resource Identifier).
Каждый запрос содержит всю информацию для обработки
Cacheable
Ответы должны помечаться как кэшируемые или нет
Uniform Interface
Единый интерфейс для всех ресурсов
Layered System
Архитектура может состоять из слоёв
Code on Demand
(опционально) Сервер может передавать исполняемый код
⚠️
Самое важное ограничение — Stateless. Сервер не хранит состояние клиента между запросами. Вся необходимая информация (токен авторизации, параметры) передаётся в каждом запросе.
HTTP-методы в REST
REST использует стандартные HTTP-методы для операций над ресурсами:
Метод
Операция
Идемпотентность
Безопасность
GET
Чтение
Да
Да
POST
Создание
Нет
Нет
PUT
Полная замена
Да
Нет
PATCH
Частичное обновление
Нет
Нет
DELETE
Удаление
Да
Нет
Идемпотентность — повторный запрос даёт тот же результат.
Безопасность — запрос не изменяет состояние сервера.
Практические примеры
CRUD операции через REST API
Получение списка пользователей (GET)
http
GET /api/users HTTP/1.1Host:example.comAuthorization:Bearer token123
❌ GET /getUsers❌ POST /createUser❌ POST /deleteUser/123✅ GET /users✅ POST /users✅ DELETE /users/123
Действие определяется HTTP-методом, а не URL.
🚫
Антипаттерн: игнорирование HTTP статус-кодов
js
// ❌ Неправильно — всегда 200, ошибка в теле{"status": 200,"success": false,"error": "User not found"}// ✅ Правильно — используем HTTP статус-коды// 404 Not Found{"error": "User not found"}
Основные HTTP статус-коды
Код
Значение
Когда использовать
200
OK
Успешный GET, PUT, PATCH
201
Created
Успешный POST (создание)
204
No Content
Успешный DELETE
400
Bad Request
Невалидные данные
401
Unauthorized
Нет авторизации
403
Forbidden
Нет прав доступа
404
Not Found
Ресурс не найден
500
Internal Server Error
Ошибка сервера
Продвинутые аспекты
Richardson Maturity Model
Модель зрелости REST API по Леонарду Ричардсону:
Уровень
Описание
Пример
Level 0
Один URL, один метод
POST /api
Level 1
Разные URL для ресурсов
POST /users, POST /orders
Level 2
HTTP-методы по назначению
GET /users, POST /users
Level 3
HATEOAS (гиперссылки)
Ответ содержит ссылки на связанные ресурсы
Большинство production API находятся на уровне 2. Уровень 3 (HATEOAS) реализуется редко из-за сложности.
Версионирование API
text
GET /api/v1/usersGET /api/v2/users
Самый распространённый подход.
Плюсы и минусы
Аспект
Плюсы
Минусы
Простота
Использует стандартный HTTP
Может быть избыточным для простых случаев
Масштабируемость
Stateless позволяет горизонтальное масштабирование
—
Кэширование
Встроенная поддержка HTTP-кэширования
Сложно кэшировать POST-запросы
Гибкость данных
Не привязан к формату (JSON, XML)
Over-fetching / Under-fetching
Связность
Слабая связанность клиента и сервера
Нет строгой типизации контракта
REST vs GraphQL vs gRPC
Критерий
REST
GraphQL
gRPC
Формат
JSON/XML
JSON
Protobuf
Транспорт
HTTP
HTTP
HTTP/2
Типизация
Нет
Схема
Строгая
Over-fetching
Да
Нет
Нет
Кэширование
Просто
Сложно
Сложно
Кривая обучения
Низкая
Средняя
Высокая
Вопросы интервьюера
Q: Что такое REST и чем он отличается от SOAP?
REST — архитектурный стиль, SOAP — протокол. REST использует стандартный HTTP, легче и гибче. SOAP требует XML и имеет строгую спецификацию (WSDL).
Q: Что означает Stateless в REST?
Сервер не хранит состояние клиента между запросами. Каждый запрос должен содержать всю информацию для обработки (токен, параметры). Это позволяет легко масштабировать систему.
Q: В чём разница между PUT и PATCH?
PUT заменяет ресурс целиком (нужно передать все поля), PATCH обновляет только указанные поля. PUT идемпотентен, PATCH — нет.
Q: Что такое идемпотентность?
Свойство операции давать одинаковый результат при многократном выполнении. GET, PUT, DELETE — идемпотентны. POST — нет (каждый вызов создаёт новый ресурс).
Q: Как обрабатывать ошибки в REST API?
Использовать соответствующие HTTP статус-коды (400, 401, 404, 500) и возвращать структурированное тело ошибки с описанием проблемы.