Это вопрос PUT vs PATCH. Другими словами, заголовок вопроса: обычно URL-адрес базового объекта существует по адресу /object/{id}
. Является ли по-прежнему идемпотентным добавление URL-адреса /object/{id}/member
и вызов PUT для этого конкретного члена?
Минимальный пример
Если у меня есть ресурс с именем Booking
, который выглядит так
public class Booking {
private bookingId;
private name;
}
//accessors ...
Я думаю, что вещи PUT и PATCH ясны. Мое замешательство связано с тем, что я решил, что относится к идемпотентности...
- идемпотентность ответа на заданный URL? ВАРИАНТ 1
- идемпотентность базовых объектов данных (Java) в отличие от членов? ВАРИАНТ 2
Если первый случай верен, то я ожидаю, что RESTful создаст конкретный вызов члену объекта Booking следующим образом:
ПОСТАВИТЬ /booking/{id}/name
ЗДЕСЬ СЕРАЯ ОБЛАСТЬ? (ОБЫЧНО ИСПРАВЛЕНИЕ НА booking/{id}
)
{
name: "Joe Schmoe"
}
В этом случае базовый объект был изменен, но ресурс остается идемпотентным (здесь GET вернет то же самое, а последующие PUT, подобные приведенным выше, ничего не изменят), потому что ресурс специфичен для члена объекта ? Или, изменив элемент, я нарушил закон идемпотентности?
Если второй вариант верен, и URL-адреса не должны быть привязаны к членам объекта, то я ожидаю использовать PATCH для члена в ресурсе URL, который представляет весь объект, для обновления определенных членов объекта, например:
ИСПРАВЛЕНИЕ /booking/{id}
*
{
name: "Joe Schmoe"
}
Я ожидаю, что НЕ RESTful будет делать следующее. Это явно нарушит идемпотентность URL-адреса ресурса. Дайте мне знать, если я ошибаюсь здесь.
ПОСТАВИТЬ /booking/{id}
{
name: "Joe Schmoe"
}