Что такое REST?
Это не протокол и не библиотека, а набор рекомендаций (constraints). Сервис можно назвать RESTful, только если он следует всем этим рекомендациям.
Junior Level
REST (Representational State Transfer) — это архитектурный стиль для построения веб-сервисов, предложенный Роем Филдингом в 2000 году.
Это не протокол и не библиотека, а набор рекомендаций (constraints). Сервис можно назвать RESTful, только если он следует всем этим рекомендациям.
Основные принципы:
- Ресурсы: Всё в REST является ресурсом, идентифицируемым через URI (например,
/users/1). - HTTP методы: Используются стандартные методы HTTP для операций над ресурсами:
GET— получение данныхPOST— создание данныхPUT— обновление данныхDELETE— удаление данных
- Stateless: Каждый запрос содержит всю необходимую информацию. Сервер не хранит состояние клиента между запросами.
- Формат данных: Обычно используется JSON или XML.
Пример REST API:
GET /users — получить всех пользователей
GET /users/1 — получить пользователя с ID 1
POST /users — создать нового пользователя
PUT /users/1 — обновить пользователя с ID 1
DELETE /users/1 — удалить пользователя с ID 1
// Обратите внимание: ресурс назван во множественном числе (/users),
// а конкретный экземпляр — через /users/{id}. Это стандартная конвенция.
Шесть ограничений REST:
- Client-Server — разделение ответственности между клиентом и сервером
- Stateless — каждый запрос независим
- Cacheable — ответы можно кэшировать
- Layered System — клиент не знает о промежуточных слоях (прокси, CDN)
- Uniform Interface — единообразие интерфейса: любой ресурс доступен через одинаковый набор операций (GET/PUT/POST/DELETE), независимо от того, что это за ресурс.
- Code on Demand (опционально) — сервер может передавать исполняемый код
Когда НЕ использовать REST
- High-frequency real-time streaming — лучше WebSockets или gRPC streams
- Внутренние микросервисы с жёсткими latency-требованиями — лучше gRPC (бинарный, быстрее сериализация)
- Сложные графовые запросы — лучше GraphQL (один запрос вместо N REST calls)
Middle Level
REST vs RESTful
- REST — это архитектурный стиль
- RESTful — конкретная реализация API, придерживающаяся REST-стиля
- Большинство “REST API” на самом деле являются HTTP API, так как игнорируют HATEOAS
HTTP API использует HTTP как транспорт, но может игнорировать REST-ограничения (например, не использовать HATEOAS или нарушать идемпотентность). RESTful API следует всем 6 ограничениям.
Richardson Maturity Model
- Level 0: HTTP как транспорт (RPC через HTTP)
- Level 1: Использование ресурсов (отдельные URI)
- Level 2: HTTP методы и статус-коды (стандарт индустрии)
- Level 3: HATEOAS (гипермедиа как двигатель состояния приложения)
Content Negotiation
Сервер и клиент договариваются о формате данных через заголовки:
Content-Type: application/json— формат отправляемых данныхAccept: application/json— формат ожидаемых данных
Vary Header
Заголовок Vary указывает, какие заголовки запроса влияют на ответ:
Vary: Accept-Encoding, Authorization
Неправильная настройка может привести к проблемам с кэшированием.
Senior Level
Архитектурные нюансы
Проблема HATEOAS в микросервисах
HATEOAS требует, чтобы сервер возвращал ссылки на связанные действия. В микросервисах это становится проблемой:
- Микросервис не знает внешнего URL API Gateway
- Решение: Использование заголовков
X-Forwarded-Hostили специальных библиотек (Spring HATEOAS)
URI Length Limit
Стандарт не ограничивает длину URI, но большинство серверов и прокси (Nginx, AWS ALB) ограничивают её до 8КБ. Если передаёте огромные фильтры в GET-запросе, можно получить 414 URI Too Long.
HTTP Method Tunneling
Если корпоративный файрвол блокирует PUT/DELETE, используется X-HTTP-Method-Override: DELETE внутри POST-запроса.
Производительность и Highload
- Thundering Herd Problem: При истечении кэша популярного ресурса тысячи запросов могут одновременно ударить в БД
- Решение: “Soft expiry” или блокировки на уровне кеширующего слоя (Redis/Memcached)
- Binary Format: Для мобильных клиентов или высоконагруженных систем REST может отдавать MessagePack или CBOR, сохраняя семантику HTTP
Modernity (Java 21 / Spring Boot 3.3)
- Virtual Threads (Project Loom): REST-контроллеры могут обрабатывать десятки тысяч соединений без WebFlux (начиная с Java 21, 2023; до этого reactive стеки были единственным способом обрабатывать десятки тысяч соединений)
- HTTP/3 (QUIC): Устраняет Head-of-Line blocking на уровне TCP
- Declarative Clients:
@HttpExchangeпозволяет описать контракт API в интерфейсе - Problem Details (RFC 9457): Стандартный JSON с полями
type,title,status,detail,instanceдля обработки ошибок
🎯 Шпаргалка для интервью
Обязательно знать:
- REST — архитектурный стиль, предложенный Роем Филдингом в 2000 году, а не протокол
- 6 ограничений REST: Client-Server, Stateless, Cacheable, Layered System, Uniform Interface, Code on Demand
- RESTful API следует всем 6 ограничениям; большинство «REST API» — это просто HTTP API без HATEOAS
- Richardson Maturity Model: Level 0–3, где Level 2 (HTTP Verbs + Status Codes) — золотой стандарт индустрии
- REST не подходит для real-time streaming (лучше WebSockets/gRPC) и сложных графовых запросов (лучше GraphQL)
- Content Negotiation работает через заголовки Content-Type и Accept
- HTTP/3 (QUIC) устраняет Head-of-Line blocking на уровне TCP
- Virtual Threads в Java 21 позволяют обрабатывать десятки тысяч соединений без reactive-стека
Частые уточняющие вопросы:
- В чём разница между REST и RESTful? — REST — стиль, RESTful — реализация, следующая всем ограничениям REST
- Что такое Uniform Interface? — Единообразие: любой ресурс доступен через одинаковый набор операций (GET/PUT/POST/DELETE)
- Какой уровень зрелости Richardson считается стандартом? — Level 2: HTTP методы и статус-коды
- Когда REST — плохой выбор? — Real-time streaming, внутренние микросервисы с жёсткими latency, графовые запросы
Красные флаги (НЕ говорить):
- «REST — это протокол» — это архитектурный стиль, не протокол
- «Любой HTTP API — это REST» — REST требует соблюдения всех 6 ограничений, включая HATEOAS
- «GET можно использовать для удаления» — GET должен быть безопасным (Safe), не менять состояние
- «HATEOAS обязателен в каждом проекте» — для внутренних микросервисов и mobile приложений HATEOAS избыточен
Связанные темы:
- [[Что означает Stateless в контексте REST]]
- [[Что такое RESTful API дизайн]]
- [[Что такое HATEOAS]]
- [[Какие HTTP статус коды вы знаете]]
- [[Что такое Accept header]]