Що таке 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; до цього реактивні стеки були єдиним способом обробляти десятки тисяч з’єднань)
- 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 дозволяють обробляти десятки тисяч з’єднань без реактивного стека
Часті уточнюючі запитання:
- В чому різниця між 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 обов’язковий у кожному проекті» — для внутрішніх мікросервісів і мобільних додатків HATEOAS надлишковий
Пов’язані теми:
- [[Що означає Stateless в контексті REST]]
- [[Що таке RESTful API дизайн]]
- [[Що таке HATEOAS]]
- [[Які HTTP статус коди ви знаєте]]
- [[Що таке Accept header]]