Как выполнять менее популярные HTTP-действия в веб-приложении RESTful?

Я разрабатываю веб-приложение Python в качестве учебного упражнения и собираюсь сделать свое приложение RESTful.

С этой целью я хочу иметь возможность обрабатывать различные типы действий / глаголов HTTP, где они применимы. Например, если виджет с идентификатором 12 представлен URI http://domain/widget/12, и Я хочу дать конечному пользователю возможность удалить этот виджет, он должен иметь возможность делать HTTP-запрос DELETE для / widget / 12.

Однако, насколько мне известно, формы HTML поддерживают только GET и POST, поэтому как мне сделать HTTP-запрос с «менее популярными» HTTP-действиями, такими как DELETE?

Предположим, что на странице просмотра виджета 12 (возвращаемой HTTP GET) я хочу включить форму только с одной кнопкой отправки, чтобы удалить этот виджет. Например:

<form action="/widget/12" method="DELETE">
<input type="submit" value="Delete Me!" />
</form>

Однако уже установлено, что HTML-формы не поддерживают DELETE для атрибута метода. Итак, каков RESTful способ выполнения запроса DELETE от клиента в этой ситуации?


person mshafrir    schedule 21.01.2009    source источник


Ответы (3)


В браузере вам нужно будет использовать XmlHttpRequest (Ajax) для сценария, который вы описываете. Если ваш клиент или сервер не поддерживает дополнительные методы, стало обычным использование настраиваемого заголовка X-HTTP-Method-Override для указания действия.

person Tracker1    schedule 21.01.2009
comment
rails имеет хороший способ использования POST, но включает параметр _method, чтобы сервер знал, что вы имели в виду. - person Sam Elliott; 20.02.2011

Вы либо туннелируете команды через POST, либо используете Ajax, либо и то, и другое (туннелирование сообщений действует как откат, когда поддержка javascript не найдена)

person Breton    schedule 21.01.2009

У Стивена Вальтера сегодня был отличный блог на эту тему.

http://stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx

В зависимости от того, насколько строго вы хотите придерживаться концепции «RESTful», использование POST для выполнения удаления вам не понравится.

person JMS    schedule 22.01.2009