Ответ
Нет, POST по спецификации HTTP не является идемпотентным. Идемпотентность означает, что многократное выполнение одного и того же запроса даст тот же результат, что и однократное. POST же предназначен для создания ресурсов, и каждый его вызов обычно приводит к созданию нового объекта.
Пример:
// Этот POST-запрос создаст новый заказ
// Повторный вызов создаст ещё один заказ с другим ID
$response = $http->post('/orders', ['product_id' => 123]);
Хотя технически можно сделать POST идемпотентным (например, проверяя дубли перед созданием), это противоречит семантике HTTP. Для идемпотентных операций лучше использовать PUT (обновление) или GET (чтение).
Ответ 18+ 🔞
А, ну ты про HTTP-методы заговорил! Ёпта, тут у людей в головах иногда такая каша, что хоть святых выноси. Слушай, раз уж спросил — объясню на пальцах, а то, бля, чувствую подозрение ебать, что половина думает, будто POST — это как кнопка «Обновить» в браузере, которую можно тыкать до посинения.
Короче, нет, блядь. POST — это не идемпотентный метод. Совсем. Вообще. Ноль целых, ноль десятых. Что такое идемпотентность? Это когда ты можешь один и тот же запрос нахуярить десять раз подряд, а в итоге система окажется в таком же состоянии, как если бы ты сделал его один раз. Как GET, например. Ты десять раз запросил главную страницу — она и осталась главной страницей, не породила тебе десять клонов сайта в базе. Или PUT, который данные обновляет. Отправил одно и то же десять раз — в базе будет лежать последняя версия, которую ты отправил, а не десять разных.
А POST — это, сука, совсем другая история. Это как кнопка «Родить ребёнка». Нажал один раз — родился один ребёнок. Нажал второй раз — охуеть, у тебя уже двойня! Каждый раз — новое существо. Семантика у него именно такая: «создать новый ресурс». Вот смотри на этот код:
// Этот POST-запрос создаст новый заказ
// Повторный вызов создаст ещё один заказ с другим ID
$response = $http->post('/orders', ['product_id' => 123]);
Отправил этот запрос — в базе появился заказ №777. Отправил его же ещё раз, ни хрена не меняя — бац, и уже заказ №778 лежит. И так до овердохуища. Система-то не знает, ты дубль отправил по ошибке или сознательно второй такой же заказ хочешь. Она просто выполняет команду: «Создай!».
Конечно, какие-то хитрожопые ребята могут сделать костыли: например, проверять перед созданием, не отправлял ли клиент уже точно такой же запрос за последние пять секунд. Но это, блядь, уже нарушение правил игры, самодеятельность. Это как взять молоток и пытаться им шурупы закручивать. Можно? Ну, если очень хочется и другого инструмента нет... но для этого есть отвёртка, нахуй!
По канону, для операций, которые должны быть идемпотентными, используют PUT (чтобы обновить что-то существующее) или тот же GET (чтобы просто посмотреть). А POST оставь для его прямого дела — создания. Иначе потом придешь на поддержку, а там у клиента в корзине 150 одинаковых товаров, потому что он F5 жал, и будешь охуевать вместе с админами. Доверия к такой системе — ноль ебать.
Запомни раз и навсегда: POST — это «создать». И точка. Всё остальное — ебушки-воробушки и кривые руки.