PUT с частичным телом обнулил поля профиля
Пользователь меняет в приложении только телефон, и клиент отправляет:
PUT /api/v1/clients/17
Content-Type: application/json
{"phone": "+79990000000"}
После этого у клиента в базе пропали имя, адрес доставки и согласие на рассылку — в них записались значения по умолчанию. Что здесь верно?
- Ничего менять в контракте не нужно: PUT по спецификации обновляет только переданные поля, а обнуление данных вызвано ошибкой маппинга в ORM при сохранении модели
- Проблема в выборе метода: для обновления существующего ресурса вместо PUT берут POST на тот же URL — он не требует полного представления и поля не затирает
- Достаточно запретить в схеме таблицы значения по умолчанию и разрешить NULL: тогда частичное тело перестанет затирать сохранённые данные
- PUT заменяет представление ресурса целиком, поэтому непереданные поля и получили значения по умолчанию: для частичного обновления нужен PATCH, а тело PUT проверяют как полное представление
