Неидемпотентный, но безопасный переход в архитектуре REST

Не могли бы вы привести пример вызова RESTful API (с использованием протокола HTTP), который одновременно является неидемпотентным и безопасным (существует ли что-то подобное)?

Чтобы подробнее рассказать об этом, читая о Дизайн, ориентированный на гипермедиа, я столкнулся с 4 аспектами аффорданса, описывающими каждый переход: безопасность, идемпотентность, изменчивость и включение. Кроме того, я столкнулся с таблицей, которая описывает HTTP-глаголы через эти аспекты, и выглядит так: это:

---------------------------------
HTTP Method    Idempotent    Safe
---------------------------------
OPTIONS        yes           yes
GET            yes           yes
HEAD           yes           yes
PUT            yes           no
POST           no            no
DELETE         yes           no
PATCH          no            no
---------------------------------

Моя интуиция подсказывает мне, что все безопасные методы тоже автоматически идемпотентны (но не наоборот). Хочу либо подтвердить, либо опровергнуть это раз и навсегда.

Заранее благодарим за ответы.


person Mladen B.    schedule 25.12.2014    source источник
comment
Я бы хотел, чтобы вместо безопасного использовалось слово неизменяемый или доступный только для чтения.   -  person Adam Gent    schedule 25.12.2014
comment
@AdamGent Согласен, так будет понятнее. Я думаю, что safe используется, чтобы избежать путаницы с проблемой изменчивости на стороне клиента.   -  person Aaron Brager    schedule 25.12.2014


Ответы (2)


Безопасный метод - тот, который ничего не меняет - по определению идемпотентен. Поскольку он ничего не изменил, он будет иметь тот же эффект (то есть никакого эффекта) независимо от того, сколько раз вы его вызываете.

person Aaron Brager    schedule 25.12.2014
comment
Нет, потому что если вы проверите документ, на который он указал, безопасный означает только чтение. Таким образом, что-то, что возвращается, говорит, что отметка времени будет безопасным, но не идемпотентным. - person Adam Gent; 25.12.2014
comment
Согласно этому документу, доступный только для чтения метод, который возвращает отметку времени, не будет RESTful. Для этого вы должны использовать GET, который должен быть реализован как безопасный и идемпотентный. - person Aaron Brager; 25.12.2014
comment
Я понимаю, что вы пытаетесь сказать, и хотел бы добавить к этому что-то. Безопасный действительно означает доступ только для чтения, который сам по себе идемпотентен, поскольку он не меняет ресурс при каждом запросе, таким образом, производит ту же эффективность / эффект (ничего не делает с ресурсом каждый раз). - person Mladen B.; 23.09.2019
comment
Что касается конечной точки GET для таймера, я считаю, что она безопасна и идемпотентна, потому что с каждым запросом мы не меняем возвращаемое время, мы только его читаем. Это похоже на то, что мы выполняем несколько запросов GET к ресурсу, который кто-то постоянно меняет с помощью запросов PUT / PATCH. Запрос GET, очевидно, безопасен и идемпотентен (поскольку он никак не меняет ресурс). Тот факт, что ресурс изменяется, является результатом чего-то еще, влияющего на это изменение, а это не наш запрос GET. Итак, конечная точка по-прежнему RESTfull, и наш запрос GET по-прежнему безопасен и идемпотентен. - person Mladen B.; 23.09.2019

да. Все безопасные методы также идемпотентны, но они относятся к двум различным (но связанным) качествам RESTful API.

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

person Jonathan W    schedule 26.12.2014