Главная/Блог/Версионирование API: как развивать бэкенд, не ломая сайт, бота и мобильные приложения

Версионирование API: как развивать бэкенд, не ломая сайт, бота и мобильные приложения

Версионирование API: как развивать бэкенд, не ломая сайт, бота и мобильные приложения
У растущего бизнеса один бэкенд часто обслуживает сразу несколько клиентов: сайт, мобильные приложения на iOS и Android, Telegram-бота, интеграции с CRM и партнёрскими сервисами. Все они общаются с сервером через API, и любое изменение на бэкенде может неожиданно сломать один из них. В результате заказы перестают приходить, бот молчит, а пользователи старой версии приложения видят ошибки на экране оплаты. Версионирование API — это дисциплина, которая позволяет развивать серверную часть без ущерба для уже работающих клиентов. В статье разберём, как это устроено и что важно знать владельцу бизнеса.

Почему «просто обновить бэкенд» — риск для бизнеса

Кажется, что достаточно внести правки на сервере и обновить все клиенты. На практике мобильные приложения так обновить нельзя: релиз в App Store проходит модерацию от 24 до 48 часов, в Google Play — от нескольких часов до нескольких дней. А главное, пользователи обновляются неохотно: через месяц после релиза заметная часть аудитории всё ещё сидит на старой версии. Сайт и Telegram-бота можно передеплоить синхронно с бэкендом, а приложения — нет. Итог сломанной совместимости предсказуем: остановившиеся заказы, шквал обращений в поддержку и ночные аварийные работы разработчиков, которые обходятся в разы дороже плановой разработки.

Какие изменения API ломают клиентов

Ломающие изменения редко выглядят драматично — чаще это «мелкие» правки, о которых вспомнили в последний момент. Типичные примеры:
  • удалить или переименовать поле в ответе: приложение ждёт client_phone, а приходит phone — экран заказа падает;
  • изменить тип данных: сумма была числом 1500.00, стала строкой «1500.00» — корзина перестала считаться;
  • сделать обязательным то, что раньше было необязательным;
  • поменять формат ошибок или коды ответов — клиент больше не понимает, что произошло;
  • изменить логику авторизации без сохранения старой схемы;
  • переименовать или удалить URL без сохранения старых адресов.
Для разработчика каждый пункт — пятиминутная правка, а для клиента API это нарушение контракта: код, который работал вчера, сегодня выдаёт ошибки. Именно поэтому такие изменения нельзя вносить тихо в существующую версию — для них нужен отдельный механизм, о котором ниже.

Версионирование через URL — самый практичный вариант

Самый распространённый и понятный способ — указывать версию прямо в адресе: /api/v1/orders и /api/v2/orders живут параллельно. Старые клиенты продолжают работать с v1, новые постепенно переводятся на v2. Существуют и другие подходы — передача версии в заголовке запроса или в параметре, — но они усложняют отладку, кэширование и документацию. Для большинства проектов версионирование через URL — оптимальный баланс простоты и надёжности. Важно другое правило: номер версии меняется только при ломающих изменениях, а не при каждой правке.

Новая версия — только для ломающих изменений

Логика здесь как в семантическом версионировании, только упрощённая. Добавление нового поля в ответ, нового метода или необязательного параметра с безопасным значением по умолчанию ничего не ломает — новая версия не нужна. А вот удаление, переименование поля или смена поведения — это уже новая мажорная версия. Пример: в ответе заказа появилось поле bonus_points — ни сайт, ни приложения не пострадают. Но если переименовать его в loyalty_points, потребуется /api/v2 и план миграции. Такой подход спасает от зоопарка из двух десятков версий: каждая поддерживаемая версия — это дополнительные расходы на тесты и поддержку.

Шесть правил обратной совместимости

Чтобы новые версии нужны были как можно реже, команда должна соблюдать простые правила при работе с существующим API:
  1. Добавляйте, но не удаляйте и не переименовывайте поля в ответах.
  2. Новые поля делайте необязательными, с безопасными значениями по умолчанию.
  3. Не ужесточайте валидацию и не добавляйте обязательные параметры в старых методах.
  4. Новую логику выносите в новые эндпоинты, а не вшивайте в старые.
  5. Изменения поведения раскатывайте под feature-флагами постепенно, на части клиентов.
  6. Фиксируйте контракт в спецификации OpenAPI и гоняйте автотесты совместимости перед каждым релизом.
Эти правила стоят на стороне бизнеса: они означают, что бэкенд можно обновлять хоть каждый день, а сайт, бот и приложения продолжат работать как работали. Дисциплина на этапе разработки стоит на порядок дешевле инцидента в продакшене.

Deprecation: как выводить старые версии без боли

Старые версии не должны жить вечно — иначе поддержка бэкенда превратится в обслуживание музея. Обычно устанавливают окно поддержки 6–12 месяцев. Работает это так: сначала в логах смотрят, кто и насколько активно использует устаревшую версию; затем предупреждают клиентов и партнёров — письмами, документацией и заголовком Sunset в ответах API; для мобильных приложений параллельно выпускают обновление с переходом на новую версию; и только когда доля запросов к старой версии падает почти до нуля, её отключают. Для публичного API политика вывода версий должна быть опубликована заранее — это вопрос репутации и доверия партнёров.

Контракт, тесты и ченджлог — страховка от сюрпризов

Чтобы совместимость не зависела от внимательности конкретного разработчика, её автоматизируют. Контракт API описывают в спецификации OpenAPI (Swagger) — она становится единственным источником правды и основой документации. Перед каждым релизом автотесты прогоняют запросы ко всем поддерживаемым версиям и проверяют, что ответы соответствуют контракту. Все изменения фиксируются в ченджлоге, доступном командам клиентов и партнёров. Такой процесс настраивается один раз — и дальше каждый релиз проходит спокойно, без ручной перепроверки в духе «а ничего ли мы не сломали».

Что версионирование даёт бизнесу

Для владельца продукта версионирование — это не абстрактная «архитектурная красота», а измеримые эффекты:
  • релизы становятся чаще и безопаснее: бэкенд обновляется без оглядки на релизные окна App Store и Google Play;
  • пользователи старых версий приложений продолжают оформлять заказы, а не видеть ошибки;
  • миграция идёт постепенно: можно перевести сайт на v2, понаблюдать неделю, а потом трогать бота;
  • меньше аварийных работ и инцидентов — ниже нагрузка на поддержку;
  • интеграции с CRM и партнёрами строятся на стабильном контракте, без постоянных согласований.

Итог

Версионирование API — это не техническая формальность, а страховка бизнеса: оно позволяет развивать продукт быстро и при этом не рисковать выручкой из-за несовместимости. Если вы планируете мультиплатформенный продукт — сайт, приложения, бота — закладывайте контракт API и версионирование ещё на этапе архитектуры: позже это обойдётся в разы дешевле. И практический совет при выборе подрядчика: спросите, как команда обеспечивает обратную совместимость, какая у неё политика deprecation и есть ли контрактные тесты. Зрелая студия ответит на эти вопросы без паузы — и это лучший индикатор того, как пройдёт ваша совместная работа.

Нужна разработка?

Оставьте заявку — обсудим ваш проект и предложим решение