Ответ
Нет, метод PATCH не является идемпотентным по умолчанию. Его идемпотентность полностью зависит от типа применяемых изменений (операций), описанных в теле запроса.
Почему:
-
Неидемпотентные операции: Инкремент, добавление в массив. Повторение запроса изменяет результат.
PATCH /users/1 {"op": "increment", "path": "/age", "value": 1}Каждый вызов увеличит возраст на 1.
-
Идемпотентные операции: Установка конкретного значения, замена. Повторение запроса не меняет конечное состояние.
PATCH /users/1 {"op": "replace", "path": "/age", "value": 30}Многократный вызов установит возраст в 30, результат не изменится.
Best Practice: Для гарантированной идемпотентности используйте формат JSON Patch (RFC 6902) с операциями replace, set или remove для конкретных значений, либо применяйте метод PUT для полной замены ресурса.
Ответ 18+ 🔞
А, слушай, вот это классика, блядь! Прямо в точку, как Герасим Муму в озеро. Ну, про метод PATCH, значит.
Так, хуй с горы, давай разбираться. Говорят, мол, PATCH — он типа идемпотентный. А это, на минуточку, значит, что сколько раз ни повтори запрос — результат должен быть один и тот же, как мой взгляд на пустую бутылку после пятницы. Но тут-то, сука, и кроется пиздец!
Нет, ёпта, метод PATCH не идемпотентный по умолчанию. Вообще нихуя. Его идемпотентность — это как погода в Питере: полностью зависит от того, что ты в теле запроса написал, от этих самых операций.
А в чём, собственно, парадокс, блядь?
-
Вот, смотри, неидемпотентная хуйня: Инкремент, добавление в массив. Повторил запрос — получил другой результат, волнение ебать! Представь, ты каждый раз на год стареешь.
PATCH /users/1 {"op": "increment", "path": "/age", "value": 1}Отправил раз — возраст 31. Отправил второй — уже 32, пидарас шерстяной! Это ж чистой воды "Муму-муму" с каждым запросом.
-
А вот идемпотентная красота: Установка конкретного значения. Замена. Тут уже терпения ноль ебать, но зато надёжно. Сколько ни бей — будет одно и то же.
PATCH /users/1 {"op": "replace", "path": "/age", "value": 30}Отправляй хоть сто раз — возраст упрётся в 30 и ни хуя не сдвинется. Как Герасим, когда решил, что всё, хватит. Точка.
Так что делать-то, мудя? Best Practice, блядь: Если тебе прям позарез нужна эта самая идемпотентность, чтобы не обосраться, то либо юзай формат JSON Patch (это RFC 6902, если чё) с операциями replace, set или remove — они по конкретным значениям бьют. Либо, если совсем страх потерять данные, да похуй, бери метод PUT и меняй ресурс целиком, как царь меняет решение. Вот так вот, в рот меня чих-пых, просто, а сколько подводных камней!