REST (Representational State Transfer) - архітектурний стиль, описаний Роєм Філдінгом. Це не протокол і не формат, а набір обмежень:
- ресурси й ідентифікатори: усе, з чим працює API, - ресурси з власними URL (
/orders/42), а не «процедури»; - уніфікований інтерфейс: дії виражаються стандартними HTTP-методами (
GET,POST,PUT,PATCH,DELETE) з їхньою семантикою; - представлення: клієнт отримує не сам ресурс, а його представлення (JSON, XML) - залежно від заголовка
Accept; - без стану (stateless): кожен запит містить усе потрібне для обробки (зокрема автентифікацію). Сервер не пам'ятає «сесію розмови» між запитами;
- кешованість: відповіді позначають, чи можна їх кешувати;
- багаторівнева система: між клієнтом і сервером можуть бути проксі, CDN, балансувальники - і клієнт про це не знає.
«Просто JSON через HTTP» (стиль RPC) виглядає інакше:
POST /api/getOrder {"id": 42}
POST /api/cancelOrder {"id": 42}
POST /api/updateOrderStatus
RESTful:
GET /api/orders/42
PATCH /api/orders/42 {"status": "cancelled"}
DELETE /api/orders/42
Що дає REST на практиці:
- передбачуваність: знаючи URL ресурсу й методи HTTP, легко здогадатися, як працювати з API;
- інфраструктура HTTP працює «з коробки»:
GETкешується проксі й браузерами, безпечні методи можна повторювати, коди стану зрозумілі моніторингу; - масштабування: відсутність стану на сервері дає змогу додавати сервери за балансувальником без «липких» сесій.
Реальність: більшість «REST API» не виконують усіх обмежень (зокрема гіпермедіа - HATEOAS), і це нормально. На співбесіді важливо розуміти суть - ресурси, семантика методів і кодів, відсутність стану, - а не догматичність.
RPC-стиль не заборонений: для дій, що не вкладаються в CRUD, чи для внутрішніх сервісів RPC (зокрема gRPC) інколи природніший. Головне - послідовність у межах одного API.