Является ли RESTful использовать ресурсы URL, специфичные для членов объекта в REST API? СТАВИТЬ или ПАТЧАТЬ?

Это вопрос 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"
}

person Jonathan Komar    schedule 11.09.2019    source источник


Ответы (1)


Прежде всего, имейте в виду, что идемпотентность — это свойство методов HTTP (а не свойство ресурсов). Цитируя RFC 7231, документ, который в настоящее время определяет семантику и содержимое HTTP/ 1.1 протокол:

4.2.2. Идемпотентные методы

Метод запроса считается "идемпотентным", если предполагаемое воздействие на сервер нескольких идентичных запросов с этим методом такое же, как и воздействие одного такого запроса. Из методов запроса, определенных этой спецификацией, PUT, DELETE и безопасные методы запроса являются идемпотентными. [...]

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

Таким образом, запрос с идемпотентным HTTP-методом может быть выполнен несколько раз, и на сервере будет произведен один и тот же эффект. Под эффектом понимается состояние ресурса на сервере, даже если ресурс имеет несколько идентификаторы.

И имейте в виду, что коды состояния не имеют значения с точки зрения идемпотентности.

person cassiomolin    schedule 11.09.2019