Прежде чем я перейду к тому, как достичь идемпотентности в запросе POST, я хотел бы объяснить, что такое идемпотент, и различные доступные методы идемпотентного REST.

Что такое идемпотент?

Операция является идемпотентной, если она будет давать одни и те же результаты при многократном выполнении.

Рассмотрим следующие примеры:

var a = 10;
a++;

Первый пример идемпотентен: независимо от того, сколько раз мы выполняем этот оператор, a всегда будет 10. Второй пример не идемпотентен. Выполнение этого n раз приведет к другому результату.

Идемпотентный HTTP-метод - это HTTP-метод, который можно вызывать несколько раз без разных результатов. Не имеет значения, вызывается ли метод только один раз или n раз. Результат должен быть таким же.

Список идемпотентных методов отдыха:

HTTP Method
OPTIONS        
GET     
HEAD     
PUT      
DELETE

Список неидемпотентных методов:

HTTP Method
POST        
PATCH

Почему по умолчанию не все методы идемпотентны?
Метод Post всегда приводит к изменению состояния сервера. Если бы метод POST был идемпотентным, все, что было отправлено и принято на веб-сервер или от него, уже должно было бы существовать на сервере в той или иной форме, чтобы отвечать теми же кодами и значениями ответа. По этой причине POST не может быть идемпотентным.

Как добиться идемпотентности с помощью метода POST и почему иногда это очень важно?
Идемпотентность важна при создании отказоустойчивого API.

Предположим, покупатель хочет произвести платеж. Затем клиент отправит серверу запрос POST, чтобы создать платеж. Поскольку POST не является идемпотентным методом, его многократный вызов может привести к дублированию платежей. Что произойдет, если вы отправите запрос POST на сервер, но получите тайм-аут? Ресурс действительно обновляется? Происходит ли тайм-аут при отправке запроса на сервер или во время ответа клиенту? Может ли клиент снова безопасно повторить попытку или нам нужно сначала выяснить, что произошло с ресурсом? Используя идемпотентные методы, нам не нужно отвечать на этот вопрос, но мы можем безопасно повторно отправить запрос до тех пор, пока не получим ответ от сервера.

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

Стандартный подход, который вы заметите, - это передача уникального ключа Idempotency-key в каждом запросе, сделанном клиентом.

Позвольте мне объяснить вам на примере:

Конечная точка, показанная на изображении выше http: // localhost: 3000 / transfer, является запросом POST для перевода суммы с одной учетной записи на другую. Как видите, мы передали ключ Idempotency-key с уникальным значением, которое находится в формате UUIDV4 в заголовках. Теперь в случае сбоя сети или отсутствия ответа от клиента мы можем отправлять один и тот же запрос снова и снова, не беспокоясь о дублировании запроса. Подождите минуту. Вы, должно быть, думаете: Как сервер будет обрабатывать его снова и снова как один и тот же запрос, а не как новый, просто добавляя ключ? теперь, просто добавив ключ, как сервер будет обрабатывать его снова и снова как один и тот же запрос вместо нового ???

Позвольте мне объяснить реализацию на стороне сервера:

На стороне сервера мы создали промежуточное ПО. Это промежуточное программное обеспечение будет проверять каждый из запросов, поступающих в приложение, и проверять, присутствует ли ключ Idempotency-key в заголовках.

Если в запросе присутствует ключ идемпотентности, мы сделаем запрос к базе данных и проверим, есть ли запись, соответствующая этому ключу идемпотентности. Если есть, промежуточное программное обеспечение остановит любое дальнейшее выполнение на самом уровне промежуточного программного обеспечения и немедленно ответит сохраненными данными в качестве ответа.

В противном случае он перейдет на уровень приложения и создаст новую запись в базе данных с ключом идемпотентности и сгенерированным ответом и, наконец, вернет тот же ответ клиенту.

Следовательно, любой запрос с тем же ключом Idempotency-key, который ранее был замечен сервером, не будет рассматриваться как новый, и сервер вернет кэшированный ответ.

Дополнительные способы:

  1. Вы можете выбрать любое хранилище для сохранения ключа идемпотентности
  2. Вы также можете установить срок действия ключа Idempotency-key на 24 часа.

Вывод:

После рассмотрения приведенного выше примера становится ясно, что идемпотентная техника важна для создания отказоустойчивого API; особенно когда вы имеете дело с вещами, связанными с платежами.

Я надеюсь, что это даст вам общее представление о том, что такое идемпотент и как сделать идемпотентным методом POST. Следите за обновлениями по связанным темам.

Спасибо за чтение!

Отзывы и мысли всегда приветствуются в разделе комментариев.