Обычно POST не является идемпотентным. Но давайте рассмотрим ситуацию, когда метод POST отправляет пользователя/пароль/пароль, а бэкэнд-приложение регистрирует нового пользователя. Пользователи уникальны, поэтому один и тот же метод POST (с теми же данными) не влияет на сервер. Новый пользователь второй раз не создается. В этом случае метод POST является идемпотентным или нет?
Является ли метод POST идемпотентным, если бэкэнд не допускает дубликатов?
Ответы (2)
Новый пользователь второй раз не создается. В этом случае метод POST является идемпотентным или нет?
Является ли этот обработчик POST идемпотентным? Да, похоже, что это так. Это, безусловно, может быть.
Это сказало; клиент общего назначения не будет знать, что этот конкретный обработчик имеет идемпотентную реализацию. Смысл единого интерфейса в том, что семантика сообщений и соответствующие гарантии везде одинаковы.
Клиент общего назначения не может предположить, что ваш обработчик POST является идемпотентным, поскольку Стандарт HTTP говорит, что мой обработчик POST не должен быть таким.
Итак, что мне делать, если моя база данных не допускает дубликатов? Я должен нарушить стандарт, верно?
Нет, то, что вы делаете, нормально и не нарушает стандарт. Стандарт не запрещает реализации POST быть идемпотентной; в нем говорится, что клиенты не могут предполагать, что операция является идемпотентной.
В этом отношении он точно аналогичен «безопасному»: стандарт не обещает, что POST-запросы безопасны, поэтому клиентам не разрешается предполагать, что они будут безопасными. Но мы по-прежнему можем использовать POST для безопасных запросов, поэтому мы можем делать такие вещи, как использовать POST для запросов SOAP/GraphQL.
Метод HTTP POST по стандартному определению на самом деле НЕ является идемпотентным. Однако всегда будет зависеть от фактической реализации внутреннего сервера, что POST будет идемпотентным.
Очевидно, REST — это не строгий стандарт, а скорее руководство по созданию RESTful API, так сказать.
Что касается вашего конкретного случая, ДА, метод POST является идемпотентным.