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

Пустое поле в API: когда сохранить значение, а когда очистить

Отсутствующее свойство, null, пустая строка и ноль могут означать разные изменения. Разбираем контракт частичного обновления на примере обмена интернет-магазина.

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

Три круглых проёма: с фиолетовым шаром, пустой и закрытый; разные состояния поля в обмене
В этой статье

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

Для частичного обновления нужно отдельно договориться о трёх действиях: оставить прежнее значение, установить новое и очистить поле. Сам JSON такого соглашения не даёт. Отсутствующее свойство, null, пустая строка и ноль различаются в данных; смысл изменения задаёт контракт конкретного метода. Это особенно полезно проверить в обмене магазина на 1С-Битрикс с 1С, CRM или собственной службой доставки.

Одно поле, три разных просьбы

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

Здесь важна граница применимости. В одном API отсутствие поля означает сохранение старого значения, в другом метод принимает полное состояние объекта и требует обязательные поля. Само слово «обновить» в названии метода ничего не гарантирует. Сначала выясняем, передаём ли мы изменения или новую полную версию данных; затем выбираем представление пустоты.

Есть стандартный вариант частичных изменений — JSON Merge Patch, описанный в RFC 7396. В объекте такого патча отсутствующее свойство остаётся без изменения, скалярное значение или массив заменяет прежнее, а null означает удаление свойства. Вложенные объекты обрабатываются рекурсивно по тем же правилам. Это правило именно данного формата, а не универсальная трактовка любого JSON-запроса.

Пусть исходный объект содержит {"comment":"Позвонить за час до доставки","quantity":2}. Патч {"quantity":0} меняет количество на ноль и сохраняет комментарий. Патч {"comment":null} удаляет свойство комментария. Патч {"comment":""} оставляет свойство с пустой строкой. Последние два результата могут выглядеть одинаково в форме заказа, но для следующего обработчика они различны.

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

JSON Merge Patch: отсутствующее поле сохраняет комментарий, пустая строка очищает текст, null удаляет свойство
Учебный пример для одного поля; правила относятся к JSON Merge Patch.

Ноль нельзя потерять по дороге

Условие «если значение непустое, отправить поле» выглядит компактно. Однако такая проверка ошибочно исключает допустимые данные из отправки. Количество товара, равное нулю, бесплатная доставка и отключённый признак могут быть вполне содержательными значениями.

Например, по условному контракту количество разрешено менять на ноль. Проверять нужно наличие свойства и допустимость его значения, а не общую «истинность» значения в языке программирования. Если отправитель исключит ноль из пакета, получатель частичного обновления сохранит прежние две единицы. Корректный JSON в этом случае доставит неверное количество товара.

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

Пустой массив — ещё один договор

Список телефонов или вложений добавляет новый вопрос: передаются отдельные изменения элементов или весь список? В JSON Merge Patch массив заменяется целиком. Пустой массив [] заменит старый массив пустым; передача одного элемента не означает «добавить только его к остальным».

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

Если сведения получить не удалось, лучше вернуть наблюдаемую ошибку этой операции или отложить изменение соответствующего поля по согласованному правилу. Нельзя выдавать неизвестное состояние за подтверждённую пустоту. И нельзя молча пропускать поле, если контракт требует полной версии объекта: тогда пакет следует отклонить до применения.

Что проверить на копии интеграции

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

  • поле отсутствует в запросе;

  • передан null;

  • передана пустая строка;

  • передан ноль или false, если тип поля это допускает;

  • передан пустой массив, если поле содержит список;

  • передан неверный тип, например строка вместо ожидаемого числа.

Проверка должна увидеть не только ответ метода, но и сохранённое состояние. Осталось ли свойство в объекте? Сохранилось ли старое значение? Удалились ли связи списка? Не заменил ли следующий этап ноль значением по умолчанию? Такой набор выполняют на тестовой копии с условными данными. Приведённые здесь объекты — учебные примеры; работа конкретного модуля 1С-Битрикс ими не подтверждена.

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

Обсуждение 0

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

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