Спроектувати REST API так, щоб не переписувати через пів року — завдання не з легких. Типова помилка — плутати REST з RPC, через що ендпоїнти стають неочевидними, а клієнти — крихкими. Інша поширена проблема — відсутність єдинообразності відповідей: один ендпоїнт повертає {data}, інший — {result}, що змушує клієнтів писати кастомні парсери. Ми в команді розробили десятки API для SaaS-платформ, що обслуговують мільйони запитів на добу, і знаємо, як уникнути цих граблів. Нижче розберемо ключові принципи, пагінацію, версіонування, обробку помилок і покажемо приклад реалізації на Laravel. Ми маємо 7+ років досвіду, понад 50 успішних проєктів та гарантію 12 місяців на всі роботи. Ми дотримуємося найкращих практик проектування RESTful API.
Ключові принципи REST API
Ресурсоорієнтованість: URL ідентифікує ресурс, HTTP метод визначає дію. Ось типовий CRUD для статей:
GET /api/v1/articles — список статей POST /api/v1/articles — створити статтю GET /api/v1/articles/42 — стаття з id=42 PUT /api/v1/articles/42 — повне оновлення PATCH /api/v1/articles/42 — часткове оновлення DELETE /api/v1/articles/42 — видалити GET /api/v1/articles/42/comments — коментарі статті Stateless: кожен запит містить всю інформацію для його обробки — жодного стану сесії між запитами. Єдинообразність відповідей: для успіху повертаємо { "data": {...} }, для списку — { "data": [...], "meta": {...} }, для помилки — { "error": { "code": "...", "message": "..." } }. Це спрощує інтеграцію та налагодження. Згідно з Wikipedia, REST спирається на єдинообразність інтерфейсу, що ми суворо дотримуємося.
Коди HTTP для API
Правильне використання кодів — основа контракту:
| Код | Ситуація |
|---|---|
| 200 OK | Успішний GET, PUT, PATCH |
| 201 Created | Успішний POST, ресурс створено |
| 204 No Content | Успішний DELETE |
| 400 Bad Request | Помилка валідації |
| 401 Unauthorized | Немає або невірний токен |
| 403 Forbidden | Немає прав (токен валідний) |
| 404 Not Found | Ресурс не знайдено |
| 409 Conflict | Конфлікт (дублікат email) |
| 422 Unprocessable Entity | Семантична помилка |
| 429 Too Many Requests | Rate limit перевищено |
| 500 Internal Server Error | Неочікувана помилка сервера |
Як вибрати пагінацію для високонавантаженого API?
Offset пагінація проста і дозволяє перейти на будь-яку сторінку, але вона на 95% повільніша на обсягах понад 1 млн записів через OFFSET у SQL. Cursor пагінація швидша в 50 разів і стабільніша при частих вставках, однак не дозволяє стрибнути на довільну сторінку. Keyset пагінація (наприклад, after_id) поєднує швидкість і простоту, вимагаючи лише унікального сортування. Порівняємо їх:
| Критерій | Offset | Cursor | Keyset |
|---|---|---|---|
| Швидкість при 1M записів | ~500ms | ~10ms | ~10ms |
| Перехід на будь-яку сторінку | Так | Ні | Ні |
| Стабільність при вставках | Ні (зміщення) | Так | Так |
| Реалізація | Проста | Середня | Проста |
Для більшості додатків ми рекомендуємо keyset: GET /api/articles?after_id=42&limit=20. Вона швидша за offset на порядок при мільйонах записів і не зсувається при додаванні нових даних. Keyset пагінація в 50 разів швидша за offset.
Як фільтрувати, сортувати та включати зв'язки?
Приклад комплексного запиту:
GET /api/articles?status=published&author_id=5&created_after=2023-01-01&sort=created_at&order=desc&include=author,tags Параметр include включає пов'язані ресурси, що знижує кількість запитів (N+1 problem). Ми використовуємо Laravel with() з перевіркою дозволених зв'язків. Така фільтрація скорочує число запитів до бази в 2-3 рази на типових сторінках, а при тисячі одночасних користувачів — економить до 40% ресурсів сервера.
Версіонування API: URL чи заголовки?
URL-версіонування (/api/v1/) — найочевидніший і найпростіший спосіб. Альтернатива — Accept header: Accept: application/vnd.app.v2+json. Ми рекомендуємо URL, оскільки він зрозумілий усім розробникам і не вимагає налаштування клієнтів. Якщо потрібна підтримка кількох версій одночасно — використовуємо middleware, який роутить запити у відповідний контролер. Це дозволяє паралельно розробляти v2 без поломки v1.
Приклад реалізації Laravel API
Контролер з фільтрацією та пагінацією
// routes/api.php Route::prefix('v1')->middleware('auth:sanctum')->group(function () { Route::apiResource('articles', ArticleController::class); Route::get('articles/{article}/comments', [CommentController::class, 'index']); }); // ArticleController public function index(IndexArticleRequest $request) { $articles = Article::query() ->when($request->status, fn($q, $v) => $q->where('status', $v)) ->with($request->include ?? []) ->paginate($request->per_page ?? 20); return ArticleResource::collection($articles); } Цей код обробляє фільтрацію, включає зв'язки та повертає єдинообразну відповідь. Документацію автоматично генеруємо через OpenAPI. Додатково покриваємо інтеграційними тестами на PHPUnit — це знижує кількість регресій на 40%.
Процес розробки REST API під ключ
Ось як ми працюємо:
- Аналіз вимог — вивчаємо бізнес-логіку, сутності та сценарії використання.
- Проектування ендпоїнтів — складаємо специфікацію OpenAPI, погоджуємо з вами.
- Реалізація — пишемо код на обраному фреймворку (Laravel, Django, Express — будь-який).
- Тестування — покриваємо unit та інтеграційними тестами (покриття не менше 85%).
- Документування — актуалізуємо OpenAPI, готуємо колекцію Postman.
- Деплой — налаштовуємо CI/CD, моніторинг і відправляємо документацію з експлуатації.
Що входить у роботу
- Специфікація OpenAPI (Swagger) з описом усіх ендпоїнтів.
- Реалізація на обраному фреймворку.
- Аутентифікація API (JWT, OAuth2, API-keys).
- Пагінація API, фільтрація та обробка помилок API.
- Інтеграційні тести (PHPUnit/Pytest).
- Колекція Postman для тестування.
- Деплой і документація з експлуатації.
- Підтримка 1 місяць після здачі.
Терміни та вартість
Термін розробки REST API для типового CRUD-додатку (10–20 ендпоїнтів) — від 1 до 2 тижнів. Вартість розраховується індивідуально, орієнтовно від $2000 до $5000. Така стандартизація дозволяє скоротити витрати на супровід API до 15% і прискорити інтеграцію сторонніх сервісів. При замовленні повного циклу — економія до 30%, що може становити до $1500. Вартість супроводу API знижується на 15%, що при типових витратах $2000 на місяць дає економію $300 щомісяця. Замовте розробку REST API — зв'яжіться з нами для оцінки вашого проєкту. Ми допоможемо спроектувати API, яке не доведеться переписувати.







