Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры1

Новый статус в API: как не завершить заказ по ошибке

Внешний сервис расширил список состояний, а магазин ещё не знает нового кода. Разбираем сохранение исходного события, остановку зависимых действий и проверку нового правила сопоставления.

Комментарии 0

Жёлтая шестиугольная фигура отдельно от фиолетового кольца: новое значение требует отдельного решения
В этой статье

Служба доставки добавила статус «ожидает уточнения адреса». Магазин знает только «создан», «в пути» и «доставлен». Старый обработчик не находит совпадения и ставит значение по умолчанию — «доставлен». Запрос успешно разобран, исключений нет, покупателю уже уходит поздравление. Формально программа отработала; смысл события она придумала сама.

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

Новое поле и новый статус — разные изменения

Дополнительное поле с комментарием иногда можно игнорировать без изменения решения. Новое значение поля статуса может определять само решение: отгружать ли товар, закрывать ли заказ, уведомлять ли покупателя. Правило «терпимо относимся к новым данным» не отвечает на вопрос, что делать с неизвестным управляющим значением.

Рекомендации Google AIP-180 отдельно предупреждают о новых значениях перечислений в ответах: старый клиент может обработать их неправильно. Это руководство по проектированию API, а не обещание совместимости любого внешнего сервиса. Для конкретной интеграции возможность расширения списка и поведение клиента нужно выяснять по её контракту.

Если проверка JSON Schema ограничивает поле через enum, значение вне списка не проходит такую проверку. Это ожидаемая работа закрытого набора. Снятие ограничения позволит прочитать строку, но не создаст корректного соответствия внутреннему статусу. Успешная валидация формы и понимание состояния — разные этапы.

Сохранить исходное значение, остановить зависимое действие

Предположим, внешний сервис прислал учебный код address_check. Получатель сохраняет именно этот код, идентификатор внешней отправки, время и идентификатор события, если он предусмотрен источником. Отдельно фиксирует результат сопоставления: правило пока отсутствует. Внутренний подтверждённый статус заказа и внешний необработанный сигнал не следует сливать в одно поле.

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

Молчаливое сохранение прежнего статуса тоже недостаточно. Оператор должен видеть, что получены новые данные, которые пока не применены. Иначе «в пути» будет выглядеть как свежая подтверждённая информация, хотя система уже встретила исключение. Нужны заметный сигнал, срок разбора и ответственный, а не вечное спокойствие зелёной карточки.

Подтверждение доставки сообщения не равно применению статуса

Получатель уведомления должен соблюдать правила повторов конкретного API. Если событие надёжно сохранено для дальнейшего разбора, протокол может позволять подтвердить получение, оставив бизнес-обработку незавершённой. Если же событие не сохранено, положительный ответ может лишить систему возможности получить его снова. Универсального HTTP-кода для любой службы здесь нет.

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

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

Как добавить правило без переписывания истории

Сначала выясняют значение нового состояния по документации поставщика. «Адрес уточняется» не равно «доставка отменена» и не равно «доставлено». Иногда прямого внутреннего аналога нет: тогда понадобится отдельное состояние интеграции или дополнительный признак, а не ближайшее слово из выпадающего списка.

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

В набор приёмки стоит включить известный код, новый непустой код, пустое значение и отсутствие поля. Затем — повтор одного события и его получение после более нового. Это разные случаи; общий результат «не упало» не доказывает правильность. Для каждого случая заранее задают, что сохраняется, какое действие разрешено и что увидит оператор.

В интеграции магазина с 1С или доставкой полезно требовать отдельный ответ на вопрос: «Что произойдёт завтра, когда словарь источника расширится?» Хороший ответ оставляет проверяемый исходный сигнал и ограничивает последствия неопределённости. Он не обещает угадать новый статус по названию.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.