Является ли метод POST идемпотентным, если бэкэнд не допускает дубликатов?

Обычно POST не является идемпотентным. Но давайте рассмотрим ситуацию, когда метод POST отправляет пользователя/пароль/пароль, а бэкэнд-приложение регистрирует нового пользователя. Пользователи уникальны, поэтому один и тот же метод POST (с теми же данными) не влияет на сервер. Новый пользователь второй раз не создается. В этом случае метод POST является идемпотентным или нет?


person Ekaterina    schedule 14.03.2020    source источник


Ответы (2)


Новый пользователь второй раз не создается. В этом случае метод POST является идемпотентным или нет?

Является ли этот обработчик POST идемпотентным? Да, похоже, что это так. Это, безусловно, может быть.

Это сказало; клиент общего назначения не будет знать, что этот конкретный обработчик имеет идемпотентную реализацию. Смысл единого интерфейса в том, что семантика сообщений и соответствующие гарантии везде одинаковы.

Клиент общего назначения не может предположить, что ваш обработчик POST является идемпотентным, поскольку Стандарт HTTP говорит, что мой обработчик POST не должен быть таким.

Итак, что мне делать, если моя база данных не допускает дубликатов? Я должен нарушить стандарт, верно?

Нет, то, что вы делаете, нормально и не нарушает стандарт. Стандарт не запрещает реализации POST быть идемпотентной; в нем говорится, что клиенты не могут предполагать, что операция является идемпотентной.

В этом отношении он точно аналогичен «безопасному»: стандарт не обещает, что POST-запросы безопасны, поэтому клиентам не разрешается предполагать, что они будут безопасными. Но мы по-прежнему можем использовать POST для безопасных запросов, поэтому мы можем делать такие вещи, как использовать POST для запросов SOAP/GraphQL.

person VoiceOfUnreason    schedule 14.03.2020
comment
Итак, что мне делать, если моя база данных не допускает дубликатов? Я должен нарушить стандарт, верно? - person Ekaterina; 15.03.2020

Метод HTTP POST по стандартному определению на самом деле НЕ является идемпотентным. Однако всегда будет зависеть от фактической реализации внутреннего сервера, что POST будет идемпотентным.

Очевидно, REST — это не строгий стандарт, а скорее руководство по созданию RESTful API, так сказать.

Что касается вашего конкретного случая, ДА, метод POST является идемпотентным.

person Community    schedule 14.03.2020
comment
Почему бы и нет? Обычно это НЕ идемпотент, но в моем конкретном случае он не создает объект во второй раз, только первый вызов влияет на систему (аналогично get, put). Вот почему он становится идемпотентным. - person Ekaterina; 15.03.2020