Подтвердить что ты не робот

Является ли PUT/DELETE idempotent автоматическим REST?

Я изучаю REST и PUT/DELETE, я прочитал, что оба из них (вместе с GET) являются идемпотентными, что означает, что несколько запросов помещают сервер в одно и то же состояние.

Повторяет ли дублирующий запрос PUT/DELETE веб-браузер (при использовании XMLHttpRequest)? Другими словами, будет ли сервер обновлять одну и ту же запись базы данных для каждого запроса PUT или будет автоматически игнорироваться дублирование запросов?

Если да, то каким образом использование PUT или DELETE отличается от использования POST?

Я прочитал статью, в которой предлагалось, чтобы веб-службы RESTful были в будущем. Есть ли какая-то особая причина, почему формы HTML5 не поддерживают методы PUT/DELETE?

4b9b3361

Ответ 1

REST - это просто структура проекта для доступа к данным и манипуляций. Нет никаких правил в отношении того, как сервер должен реагировать на запросы данных.

При этом обычно запрос REST PUT или DELETE будет выглядеть следующим образом:

DELETE /item/10293

или

PUT /item/23848
foo=bar
fizz=buzz
herp=derp

Указанные запросы связаны с определенным идентификатором. Из-за этого, говоря, что сервер удаляет один и тот же ID 15 раз, будет в конечном итоге иметь тот же результат, что и вызов его один раз, если не произойдет какой-то повторной нумерации.

С запросом PUT, сообщая серверу об обновлении определенного элемента к определенным значениям, также будет иметь тот же результат.

Случай, когда команда будет не-идемпотентной, обычно включает какое-то относительное значение:

DELETE /item/last

Вызов 15 раз скорее всего удалит 15 элементов, а не тот же последний элемент. Альтернативный вариант использования HTTP может выглядеть так:

POST /item/last?action=delete

Опять же, REST не является официальной спецификацией, это просто структура с некоторыми общими качествами. Существует множество способов реализации структуры RESTful.


Что касается форм HTML5, поддерживающих PUT и DELETE, это действительно позволяет браузерам начать поддерживать разные методы, а не сама спецификация. Если бы все браузеры начали внедрять различные методы отправки формы, я уверен, что они будут добавлены в спецификацию.

В Интернете, как это происходит, хорошая реализация RESTful также может включать какую-либо форму AJAX, так что мне кажется, что это в основном не нужно.

Ответ 2

Повторяет ли дублирующий запрос PUT/DELETE веб-браузер (при использовании XMLHttpRequest)?

Да, конечно. Идемпотентность - это только конвенция, и она не применяется. Если вы сделаете запрос, дублируете или нет, он будет работать.

Другими словами, будет ли сервер обновлять одну и ту же запись базы данных для каждого запроса PUT или будет автоматически проигнорировать запросы на повторение?

Если он соответствует REST, он должен дважды обновить одну и ту же запись базы данных, например, запустить UPDATE user SET name = 'John' дважды. Нет гарантии, что это будет или не будет делать, но зависит от того, как это реализовано.

Если да, то каким образом использование PUT или DELETE отличается от использования POST?

Это просто конвенция. Запросы PUT и DELETE могут обрабатываться или не обрабатываться иначе, чем POST в коде сайта.

Я прочитал статью, в которой предлагалось, чтобы веб-службы RESTful были в будущем. Есть ли какая-то особая причина, почему формы HTML5 не поддерживают методы PUT/DELETE?

Я не уверен, честно говоря. Вы можете обойти это, используя скрытое поле <input> под названием _method или подобное, и установите его для DELETE или PUT, а затем обработайте эту сторону сервера.

Ответ 3

Операция PUT является идемпотентной, но не безопасной. При успешном выполнении операции PUT она не будет вставлять повторяющиеся записи. Повторите операцию PUT в случае ошибок NetworkFailure после проверки условных заголовков типа If-unmodified-since и/или if-match. Не повторяйте в случае кодов ошибок 4XX или 5XX.