Является ли метод POST идемпотентом, если бэкэнд не допускает дублирования? - PullRequest
0 голосов
/ 14 марта 2020

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

Ответы [ 2 ]

1 голос
/ 15 марта 2020

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

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

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

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

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

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

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

0 голосов
/ 14 марта 2020

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

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

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

...