Какие последствия использования PUT вместо PATCH для изменения части объекта
Что проверяют
Понимаете ли вы семантику HTTP-методов настолько, чтобы увидеть в ней источник багов, а не просто пересказать определения. Следом обычно спрашивают, как бы вы это протестировали и что такое идемпотентность.
Как отвечать
Начните с семантики:
- PUT (RFC 9110): заменяет состояние ресурса целиком тем, что пришло в теле. Идемпотентен: повтор того же запроса даёт то же состояние;
- PATCH (RFC 5789): применяет частичное изменение, идемпотентность не гарантирована и зависит от формата. Распространены JSON Merge Patch (
application/merge-patch+json, гдеnullудаляет поле) и JSON Patch (application/json-patch+json, список операцийadd,remove,replace,testи других).
Последствия, если частичное изменение шлют через PUT:
- потеря данных: ресурс заменяется целиком, поэтому поля, которых нет в теле, пропадают или сбрасываются в значения по умолчанию. Клиент хотел поменять
email, а обнулилphone; - гонка обновлений: клиент читает объект, меняет поле и отправляет всё целиком. Если между чтением и записью объект изменил кто-то другой, чужие правки молча затираются. Защита:
ETagи заголовокIf-Match, при несовпадении сервер отвечает412 Precondition Failed; - расхождение со спецификацией: многие бэкенды на деле обрабатывают PUT как PATCH и не трогают отсутствующие поля. Это надо фиксировать в документации, иначе клиенты завяжутся на случайное поведение.
Как тестировать: отправить PUT с неполным телом и сделать GET, сравнив все поля; повторить PUT и убедиться, что состояние не изменилось; проверить реакцию на пропуск обязательных полей (400 или 422); отправить PATCH с null и посмотреть, удаляется поле или записывается пустое значение. Инструменты: Postman, REST Assured, pytest с requests.
Где спотыкаются
Главным последствием называют лишний трафик. Объём тела почти никогда не проблема, проблема в потерянных данных.
Утверждают, что PATCH всегда неидемпотентен. Merge Patch, выставляющий поле в значение, идемпотентен, а вот JSON Patch с add в конец массива нет.
Проверяют только код ответа. 200 OK на PUT ничего не говорит о полях, которых не было в запросе, нужен контрольный GET.