Переклад ключових тез статті з restfulapi.net
REST (Representational State Transfer) — архітектурний стиль для побудови мережевих застосунків, запропонований Роєм Філдінгом у 2000 році. REST — не протокол і не специфікація, а набір архітектурних обмежень. HTTP-API не є автоматично RESTful — важливо дотримуватись принципів.
| Обмеження | Суть |
|---|---|
| Єдиний інтерфейс | Кожен ресурс має єдиний URI; взаємодія — через стандартні HTTP-методи |
| Клієнт–сервер | Клієнт і сервер розвиваються незалежно |
| Без збереження стану | Кожен запит містить всю необхідну інформацію; сесії на сервері — відсутні |
| Кешування | Відповіді мають позначатись як кешовані або ні |
| Багаторівневість | Клієнт не знає, з яким саме вузлом він спілкується |
| Код на вимогу (опційно) | Сервер може повертати виконуваний код (наприклад, JS-віджет) |
Порада: порушення одного-двох обмежень не робить API «не-REST» — але чим більше дотримано, тим краще масштабованість і супроводжуваність.
Перший крок — визначити ресурси системи. Для мережевого застосунку це можуть бути пристрої та їхні конфігурації:
Device— пристрій із полямиid,description,statusтощоConfiguration— налаштування пристрою (підресурсDevice)
Кожен об'єкт повинен мати унікальний ідентифікатор (id).
Правила побудови URI:
- Тільки іменники — дієсловам у URI не місце
- Ієрархія відображає зв'язок «ресурс → підресурс»
- Колекції — у множині
GET /devices # список пристроїв
GET /devices/{id} # один пристрій
GET /devices/{id}/configurations # конфігурації пристрою
GET /devices/{id}/configurations/{configId}
❌
/getDevice,/createConfiguration— так не можна
✅/devices,/devices/{id}/configurations— правильно
| Метод | Дія | Ідемпотентний? |
|---|---|---|
GET |
Отримати ресурс | ✅ |
POST |
Створити ресурс | ❌ |
PUT |
Повністю замінити ресурс | ✅ |
PATCH |
Частково оновити ресурс | ✅ |
DELETE |
Видалити ресурс | ✅ |
Ідемпотентність важлива для надійності: якщо мережа дала збій і клієнт повторив PUT або DELETE — побічних ефектів не виникне. З POST — інакше, повторний виклик може створити дублікат.
- Найпоширеніший формат — JSON (або XML)
- Колекції повертають короткий опис ресурсів; детальна інформація — по окремому URI
- Для великих колекцій застосовують пагінацію:
GET /devices?startIndex=0&size=20
GET /configurations?startIndex=0&size=20
Правильні статус-коди — частина контракту API:
| Код | Значення |
|---|---|
200 OK |
Успіх (GET, PUT) |
201 Created |
Ресурс створено (POST) |
204 No Content |
Успіх без тіла (DELETE) |
400 Bad Request |
Помилка клієнта |
404 Not Found |
Ресурс не знайдено |
500 Internal Server Error |
Помилка сервера |
❌ Повертати
200 OKу разі помилки — поширена і груба помилка.
Ресурс може містити посилання (links) на пов'язані ресурси — клієнту не потрібно знати URI наперед, він їх «відкриває» динамічно. На практиці повний HATEOAS рідко реалізують, але додавання _links у відповідь підвищує зручність API.
Закладайте версію з першого дня:
/api/v1/devices
/api/v2/devices
- Використовуйте Bearer-токени (JWT) у заголовку
Authorization - Не зберігайте стан сесії на сервері — це руйнує горизонтальне масштабування
Розробник, який вивчив один ваш ендпоінт, повинен інтуїтивно розуміти решту. Єдиний стиль іменування, однакова структура відповідей, передбачувані коди — ознаки зрілого API.
Ресурси → URI (іменники) → HTTP-методи → Формат → Коди відповідей
Дотримання цих принципів дає API, який легко споживати, тестувати, масштабувати і розвивати незалежно від клієнтів.