Версіонування API для веб-застосунку
Уявіть: ви додали у відповідь API нове поле, і мобільний застосунок партнера перестав працювати. Така ситуація коштувала одному з наших клієнтів 3 дні екстреного викочування патча. Впровадження версіонування API для веб-застосунку вирішило проблему раз і назавжди. Без версіонування API будь-яка зміна ламає інтеграції. Ми впровадили версіонування для 30+ проєктів — від стартапів до enterprise. Досвід показує: правильна стратегія зберігає сумісність і економить до 40% часу на підтримку, що в грошовому еквіваленті становить значну суму на рік на проєкт.
Типовий кейс: клієнтська база зросла, знадобилося додати у відповідь список тегів з ID замість рядків. Оновлення мобільного застосунку планувалося через два місяці — весь цей час старі версії мають працювати. Версіонування дозволило зробити це без даунтайму та без правок з боку клієнтів.
Чому версіонування API критичне для веб-застосунків?
У production API обслуговує десятки клієнтів з різними версіями коду. Ви не можете змусити їх оновитися миттєво. Версіонування дає можливість випускати нові можливості, зберігаючи працездатність старих клієнтів. Без нього команда або заморожує API, або додає костилі на кшталт флагів і полів-дублерів, що ускладнює код і веде до помилок.
Основні стратегії версіонування
| Стратегія | Механізм | Сумісність з кешуванням | Складність реалізації |
|---|---|---|---|
| URL-версіонування | /api/v1/articles |
Повна (CDN, браузер) | Низька |
| Header-версіонування | Accept: vnd.myapp.v2+json |
Потрібен Vary | Середня |
| Query-параметр | ?version=2 |
Обмежена | Низька |
На практиці URL-версіонування в 2 рази простіше для кешування, ніж header-версіонування. Header-версіонування складніше тестувати через приховані заголовки. Query-параметри не рекомендуються, оскільки змішують версію з бізнес-логікою. Для публічних API з великою кількістю клієнтів вибирайте URL-версіонування. Якщо API вже в production і змінити URL неможливо — використовуйте header. Як зазначено в документації OpenAPI, URL-версіонування — бажаний підхід.
Як реалізувати версіонування в популярних фреймворках?
Laravel (PHP 8.3+)
// routes/api.php Route::prefix('v1')->group(base_path('routes/api_v1.php')); Route::prefix('v2')->group(base_path('routes/api_v2.php')); // routes/api_v2.php Route::apiResource('articles', App\Http\Controllers\V2\ArticleController::class); Контролери V2 успадковують від V1, перевизначаючи лише методи, що змінилися:
namespace App\Http\Controllers\V2; use App\Http\Controllers\V1\ArticleController as V1Controller; class ArticleController extends V1Controller { public function index(Request $request) { // V2: додали поле excerpt, прибрали body зі списку return ArticleV2Resource::collection( Article::paginate($request->per_page ?? 20) ); } } NestJS (Node.js)
// main.ts app.setGlobalPrefix('api'); app.enableVersioning({ type: VersioningType.URI }); @Controller({ path: 'articles', version: '2' }) export class ArticleV2Controller { @Get() findAll() { ... } } Як управляти життєвим циклом версій?
Типовий процес:
- Нова версія анонсується в CHANGELOG зі списком breaking changes.
- Стара версія позначається як deprecated — у відповіді додають заголовки
DeprecationіSunset. - Через 6–12 місяців після анонсу стара версія вимикається.
// Middleware додає Deprecation-заголовок до V1-відповідей class AddDeprecationHeader { public function handle($request, Closure $next) { $response = $next($request); if (str_starts_with($request->path(), 'api/v1/')) { $sunsetDate = now()->addMonths(6)->toRfc7231String(); $response->headers->set('Deprecation', 'true'); $response->headers->set('Sunset', $sunsetDate); $response->headers->set('Link', '<https://api.example.com/v2/>; rel="successor-version"'); } return $response; } } Що є breaking change?
Не всі зміни потребують нової версії. Нижче таблиця для швидкої перевірки:
| Тип зміни | Приклад | Нова версія? |
|---|---|---|
| Додавання поля | +excerpt |
Ні |
| Видалення поля | -body з відповіді |
Так |
| Зміна типу | published_at: string -> integer |
Так |
| Додавання ендпоінту | GET /stats |
Ні |
| Перейменування поля | title -> name |
Так |
Backward-compatible зміни: додавання поля, додавання опціонального параметра запиту, додавання ендпоінту. Breaking changes, що потребують нової версії: видалення поля, перейменування, зміна типу, видалення ендпоінту.
Чек-лист впровадження версіонування
- [ ] Аудит поточного API та виявлення залежностей
- [ ] Вибір стратегії (URL/header)
- [ ] Розділення роутів за версіями
- [ ] Реалізація успадкування контролерів (V2 extends V1)
- [ ] Налаштування Deprecation-заголовків та Sunset-дати
- [ ] Створення CHANGELOG для кожної версії
- [ ] Генерація окремих OpenAPI-специфікацій
- [ ] Навчання команди
Які метрики покращує версіонування?
Правильне версіонування знижує кількість інцидентів, пов'язаних зі змінами API, на 60–70%. Час на інтеграцію нових клієнтів скорочується в 2–3 рази, оскільки вони можуть використовувати актуальну версію без очікування оновлення старих. Наші замовники відзначають, що після впровадження версіонування витрати на підтримку API зменшуються на 30% вже в перший квартал. Середня економія бюджету клієнта становить від кількох сотень тисяч до мільйона гривень на рік на підтримці застарілих версій.
Що входить в роботу з впровадження версіонування?
Ми надаємо:
- Аудит поточного API та виявлення залежностей
- Вибір оптимальної стратегії (URL/header)
- Реалізацію роутингу та успадкування контролерів
- Налаштування Deprecation-заголовків та Sunset-дати
- Створення та підтримку CHANGELOG
- OpenAPI-специфікації для кожної версії
- Навчання команди роботі з версіонуванням
Строки та вартість
Налаштування базового URL-версіонування з розведенням роутів і успадкуванням займає від 2 до 3 днів. Повний цикл з автоматичним changelog, Sunset-моніторингом та окремими OpenAPI-файлами — до тижня. Вартість розраховується індивідуально під ваш проєкт. Оцінимо задачу після короткого дзвінка — зв'яжіться з нами.
Гарантуємо сумісність з існуючими клієнтами та документальну підтримку. Замовте впровадження версіонування у вашому проєкті — наші інженери допоможуть вибрати оптимальну стратегію. Отримайте консультацію щодо вашого проєкту.







