-10%Переходите к нам от другого подрядчика — дадим скидку на первый этап работ

Версионирование и документирование API магазина

Версионирование и документирование REST API интернет-магазина на 1С-Битрикс

API магазина редко существует само по себе: на нём висят мобильное приложение, интеграции с 1С и маркетплейсами, партнёрские сервисы и внутренние потребители. И как только у API появляются внешние клиенты, любое неаккуратное изменение перестаёт быть «просто правкой» — оно превращается в аварию у тех, кто на этот API завязан. Убрали поле, поменяли формат — и чужая интеграция легла.

Эта статья — о том, как версионировать и документировать API интернет-магазина на 1С-Битрикс, чтобы развивать его без боли для потребителей: какие стратегии версий выбрать, как сохранять обратную совместимость, зачем нужна спецификация OpenAPI и как аккуратно выводить старые версии из эксплуатации. Практическую реализацию таких интеграций мы закрываем услугой автоматизации на 1С.

Коротко

  • Версионирование даёт развивать API, не ломая существующих потребителей: старые версии живут, новые добавляются.
  • Добавлять поля и методы можно, убирать и менять — только через новую версию.
  • Спецификация OpenAPI — единственный источник правды, из которого растут документация, клиенты и тесты.
  • Старые версии выводятся управляемой депрекацией с заголовками Deprecation/Sunset, а не резким отключением.

Зачем магазину версионировать API

Суть проблемы в том, что у вас и у потребителей API разные скорости. Вы хотите развивать магазин: добавлять поля, менять структуру ответов, улучшать методы. Потребители хотят стабильности: чтобы их код, написанный полгода назад, продолжал работать. Без версионирования эти интересы сталкиваются, и каждое улучшение рискует сломать чью-то интеграцию.

Версионирование разводит эти скорости. Вы выпускаете новую версию API, а старая продолжает работать. Потребители переходят на новую в своём темпе, а не в момент вашего релиза. Так API становится развиваемым продуктом, а не миной, на которой подрывается любая интеграция при каждом изменении.

Что ломает потребителей API

Чтобы управлять совместимостью, нужно чётко понимать, какие изменения ломающие, а какие безопасные.

ИзменениеЛомающее?Как выпускать
Добавление необязательного поляНетВ текущей версии
Добавление нового методаНетВ текущей версии
Удаление или переименование поляДаНовая версия
Изменение типа/формата данныхДаНовая версия
Новое обязательное поле в запросеДаНовая версия
Изменение смысла ответаДаНовая версия

Общее правило легко запомнить: добавлять можно, убирать и менять — нельзя без новой версии. Пока вы только расширяете контракт, старые клиенты продолжают работать. Как только вы что-то убираете или меняете — это новая версия.

Обмен данными сайта с внешним сервисом Сайткаталог, заказыВнешний сервисREST APIОбменочередь / APIДанные идут в обе стороны по расписанию или по событию
Схема: сайт и Внешний сервис обмениваются данными в обе стороны — по расписанию или по событию. Товары и остатки приходят на сайт, заказы уходят обратно.

Стратегии версионирования

Есть несколько способов обозначить версию, и у каждого свои плюсы:

Для API магазина, которым пользуются внешние разработчики, обычно выбирают версионирование в URL: оно самое понятное для потребителей и прозрачное в диагностике. Главное — выбрать один способ и придерживаться его во всём API, а не смешивать.

Обратная совместимость

Версионирование — не индульгенция плодить версии по любому поводу. Наоборот, задача — как можно дольше сохранять обратную совместимость внутри одной версии, добавляя, а не ломая.

Принцип терпимости: сервер должен быть щедр в том, что отдаёт, и терпим к тому, что принимает. Клиенты обязаны игнорировать незнакомые поля, а не падать на них. Тогда добавление новых полей остаётся безопасным.

Новую версию заводят только тогда, когда без ломающего изменения действительно не обойтись. Чем реже вы плодите версии, тем меньше их нужно поддерживать параллельно. Хорошее API годами живёт на одной мажорной версии, аккуратно прирастая необязательными полями.

Семантика версий и правила изменений

Полезно применять к API семантическое версионирование в упрощённом виде. Для внешних потребителей значима мажорная версия — она меняется только при ломающих изменениях. Минорные улучшения и исправления живут внутри мажорной версии и не требуют миграции клиентов.

  1. Мажор — только на ломающее. v1 → v2 выпускается, когда без несовместимого изменения нельзя.
  2. Минор — на добавление. Новые необязательные поля и методы внутри той же мажорной версии.
  3. Патч — на исправления. Багфиксы без изменения контракта, прозрачные для клиентов.
  4. Явный журнал изменений. Каждое изменение фиксируется в changelog с пометкой совместимости.

Прозрачный журнал изменений — часть контракта. Потребители должны видеть, что изменилось и безопасно ли это, не читая исходники.

Документация как источник правды

Главная беда документации API — она устаревает. Разработчик поменял метод, а описание осталось прежним, и потребитель работает по неверной инструкции. Лечится это переносом источника правды в машиночитаемый формат, который живёт рядом с кодом.

Спецификация становится не «документом для людей», а формальным контрактом: из неё генерируются и человекочитаемая документация, и клиентские библиотеки, и тесты. Обновляется она в том же коммите, что и изменение кода. Тогда документация физически не может разойтись с реальностью, потому что она часть кодовой базы. Про организацию сервисного слоя, который стоит за таким API, мы писали в материале про D7 ORM в 1С-Битрикс.

OpenAPI и генерация артефактов

Стандарт де-факто для описания REST API — OpenAPI. Это машиночитаемая спецификация, из которой автоматически растут полезные артефакты:

Ключевая дисциплина — спецификация первична. Сначала описывается контракт, потом реализуется код, а не наоборот. Тогда OpenAPI остаётся единым источником правды, а не запоздалой документацией задним числом.

Депрекация и вывод из эксплуатации

Рано или поздно старую версию нужно отключить. Делать это резко — значит устроить аварию всем, кто не успел мигрировать. Правильный путь — управляемая депрекация.

  1. Объявите устаревание. Пометьте версию как deprecated в документации и changelog.
  2. Добавьте заголовки. В ответы старой версии — Deprecation и Sunset с датой отключения.
  3. Соберите статистику. Отследите, кто и как активно пользуется старой версией.
  4. Уведомите потребителей. Свяжитесь с активными клиентами, помогите с миграцией.
  5. Дайте переходный период. Разумный срок на переход, а не пара дней.
  6. Отключайте по факту. Гасите версию, когда трафик упал до нуля или согласован с оставшимися.

Такой процесс превращает отключение версии из аварии в плановое событие, к которому все готовы заранее.

Реализация в 1С-Битрикс

В 1С-Битрикс REST-API строится на модуле rest, событиях и обработчиках. Версионирование накладывается сверху понятной архитектурой:

Отдельная важная тема — безопасность доступа к API: ключи, ограничение методов, защита вебхуков. Её мы подробно разбирали в статье про REST, вебхуки и безопасность в 1С-Битрикс. Версионируемое API без продуманной безопасности — половина решения.

Контрактные тесты и деплой

Версионирование защищает от запланированных изменений, а контрактные тесты — от случайных. Тест сверяет реальные ответы API со спецификацией OpenAPI: поля, типы, коды. Если разработчик нечаянно убрал поле или поменял тип, тест падает ещё до релиза, а не после жалоб интеграторов.

Эти проверки встраиваются в конвейер сборки и деплоя: код проходит ревью и контрактные тесты, выкатывается на стенд, затем в прод через управляемый деплой с откатом. Так несовместимое изменение физически не уедет в продакшен незамеченным. Про организацию такого конвейера мы писали в материале про CI/CD и деплой в 1С-Битрикс, а про надёжную среду выполнения — в статье о хостинге и BitrixVM.

Частые ошибки

Чек-лист внедрения

  1. Выбрана стратегия версий. Один способ (обычно URL) применён ко всему API.
  2. Правила совместимости заданы. Команда знает, что ломающее, а что нет, и как это выпускать.
  3. Есть спецификация OpenAPI. Контракт описан машиночитаемо и лежит рядом с кодом.
  4. Артефакты генерируются. Документация и клиенты растут из спецификации, не пишутся вручную.
  5. Общий сервисный слой. Логика в сервисах на D7, версии переиспользуют код.
  6. Процесс депрекации описан. Заголовки Deprecation/Sunset, статистика, уведомления, переходный период.
  7. Контрактные тесты в CI. Ответы сверяются со спецификацией на каждом деплое.
  8. Безопасность настроена. Ключи, права, ограничение методов по версиям.

Вывод

API магазина — это продукт с внешними потребителями, и относиться к нему нужно как к продукту. Версионирование даёт развивать его, не ломая интеграции: старые версии живут, новые добавляются, а клиенты мигрируют в своём темпе. Простое правило «добавлять можно, убирать и менять — только через новую версию» снимает большую часть проблем совместимости.

Опорой всему служит спецификация OpenAPI как единственный источник правды, из которого растут документация, клиенты и контрактные тесты. Добавьте управляемую депрекацию, общий сервисный слой на D7 и проверки в конвейере деплоя — и API магазина станет тем, на что интеграторы могут положиться, а вы сможете развивать его без страха что-нибудь сломать.

Частые вопросы

Зачем вообще версионировать API магазина?

API магазина используют внешние потребители: мобильное приложение, интеграции с 1С и маркетплейсами, партнёрские сервисы. Любое несовместимое изменение ломает их работу без предупреждения. Версионирование позволяет выпускать новые версии, не ломая старые: клиенты переходят на новую версию в своём темпе, а вы развиваете API, не превращая каждое улучшение в аварию у потребителей.

Какой способ версионирования выбрать: в URL или в заголовке?

Чаще всего практичнее версия в URL, например /api/v1/ и /api/v2/: она наглядна, легко тестируется в браузере и однозначна в логах. Версия в заголовке чище с точки зрения REST, но менее прозрачна в отладке и кэшировании. Для магазина с внешними интеграторами обычно выбирают URL-версионирование как самое понятное для потребителей вашего API.

Что считается ломающим изменением API?

Ломающими считаются: удаление или переименование поля и метода, изменение типа или формата данных, ужесточение обязательности параметров, изменение семантики ответа. Неломающие изменения — добавление новых необязательных полей и методов, расширение перечислений с сохранением старых значений. Правило простое: добавлять можно, убирать и менять — только через новую версию.

Как документировать API, чтобы документация не устаревала?

Используйте машиночитаемую спецификацию OpenAPI как единственный источник правды: из неё генерируются и человекочитаемая документация, и клиенты, и тесты контракта. Держите спецификацию в репозитории рядом с кодом и обновляйте её в том же коммите, что и изменение API. Тогда документация не расходится с реальностью, потому что она часть кодовой базы, а не отдельный документ.

Как правильно выводить старую версию API из эксплуатации?

Через управляемую депрекацию, а не резким выключением. Объявите версию устаревшей, сообщите дату отключения, добавьте в ответы предупреждающий заголовок Deprecation и Sunset, соберите статистику по использующим её клиентам и уведомите их. Дайте разумный переходный период. Отключайте старую версию только после того, как трафик на неё упал до нуля или согласован с оставшимися потребителями.

Как версионирование API связано с 1С-Битрикс и REST?

В 1С-Битрикс REST-методы реализуются через модуль rest, события и обработчики. Версионирование накладывается сверху: маршруты разделяются по версиям, а бизнес-логика выносится в сервисный слой на D7, чтобы разные версии переиспользовали общий код. События позволяют аккуратно расширять поведение, не меняя контракт. Безопасность доступа при этом выстраивается через ключи, права и ограничение методов.

Нужны ли контрактные тесты для API магазина?

Да, они защищают от случайных ломающих изменений. Контрактный тест проверяет, что ответы API соответствуют опубликованной спецификации OpenAPI: поля, типы, коды ответов. Если разработчик случайно убрал поле или поменял тип, тест падает ещё до релиза. Для API, от которого зависят внешние интеграции, это дешёвая страховка от аварий у потребителей и репутационных потерь.

Как выкатывать изменения API безопасно?

Через дисциплину развёртывания: изменения проходят код-ревью и контрактные тесты, выкатываются на стенд, затем в прод через управляемый деплой с возможностью отката. Новую версию можно включать постепенно и следить за ошибками. Автоматизированный конвейер сборки и деплоя снижает риск, что несовместимое изменение случайно уедет в продакшен и сломает интеграции.

Поделиться:

Нужно API магазина, которое не ломает интеграции?

Спроектируем версионируемое REST API на 1С-Битрикс, опишем контракт в OpenAPI и настроим контрактные тесты и депрекацию. Рассчитаем работу по вашему проекту.

Автоматизация на 1С

Игорь Воскресенский

Команда B2Bsite. С 2014 года разрабатываем интернет-магазины и порталы на 1С-Битрикс: проектируем REST API, интеграции с 1С и маркетплейсами так, чтобы их можно было развивать без аварий.

← Все статьи блога