Я знаю, что операции REST PUT должны быть идемпотентными.И я знаю, что они предназначены для поддержки управления версиями (поэтому, если я попытаюсь обновить объект, на котором у меня была старая версия 4, но новая версия - 5, я должен получить ответ о конфликте 409. Но как правильно обращаться с идемпотентностью?и управление версиями?
Допустим, у моих объектов есть версия и одно поле данных (например, «имя»). Если мой текущий объект находится в / objects / 1 и имел версию 1 с именем «Алиса», и я хотел обновить его до версии 2 с именем «bob», я, вероятно, отправил бы PUT с версией 2 и именем «bob». Но, поскольку он идемпотентен, я должен иметь возможность отправлять его повторно и иметь эффектто же самое, что и один вызов. Последующие вызовы обычно не проходят проверку версий, за исключением того, что их другие данные будут соответствовать тому, что находится на сервере, и могут быть обнаружены как (или, по крайней мере, предполагается, что) повторяющиеся запросы.
Должны ли ответы на все повторяющиеся вызовы быть одинаковыми (например, 200 OK или 204 Нет содержимого)? Или код ответа должен указывать, является ли вызов действительнымли внес изменения (и увеличил версию), или был ли он обнаружен как повторный вызов (что в противном случае было бы помечено как конфликт 409, за исключением того факта, что данные в PUT были такими же, как те, что уже были там)?И если это должно указывать на разницу, каков подходящий способ отличить их в ответе?
И, я полагаю, мне следует также спросить, обычно ли REST-управление версиями выполняется в объекте (например, с полем версииобъект REST), или это делается в протоколе REST (например, как поле HTTP, сохраняя объект «чистым»)?