Какая польза от методов HTTP-запроса PUT и DELETE?

89

Я много читал об этом, но не могу сделать вывод по этой теме.

Но я никогда не использовал методы HTTP-запроса PUT или DELETE. Моя тенденция - использовать GET, когда статистика системы (мое приложение или веб-сайт) не может быть затронута (например, список продуктов), и использовать POST, когда это влияет (размещен заказ). Этого недостаточно или я что-то упускаю?

Рупеш Патель
источник
2
PUT / DELETE проще кодировать, но сложнее настроить (с точки зрения безопасности - каталог vhost / apache). Мое скромное мнение ... без них можно жить.
Najzero
5
@Najzero да, я без них очень счастлив :) но мне нужен ответ, почему они там ?? прочитал кое-что, но не смог справиться
Рупеш Патель

Ответы:

88

DELETE предназначен для удаления ресурса запроса:

Метод DELETE требует, чтобы исходный сервер удалил ресурс, указанный в Request-URI. Этот метод МОЖЕТ быть переопределен вмешательством человека (или другими средствами) на исходном сервере. Клиенту не может быть гарантировано, что операция была выполнена, даже если код состояния, возвращенный исходным сервером, указывает, что действие было выполнено успешно ...

PUT предназначен для размещения или обновления ресурса на сервере:

Метод PUT запрашивает, чтобы закрытый объект был сохранен под предоставленным Request-URI. Если Request-URI относится к уже существующему ресурсу, вложенный объект СЛЕДУЕТ рассматривать как модифицированную версию того, который находится на исходном сервере. Если Request-URI не указывает на существующий ресурс, и этот URI может быть определен как новый ресурс запрашивающим пользовательским агентом, исходный сервер может создать ресурс с этим URI ...

Для получения полной спецификации посетите:

Поскольку текущие браузеры, к сожалению, не поддерживают никаких других глаголов, кроме POST и GET в HTML-формах , вы обычно не можете использовать HTTP в полной мере с ними (хотя вы все равно можете захватить их отправку через JavaScript). Отсутствие поддержки этих методов в HTML-формах привело к появлению URI, содержащих глаголы, например

POST http://example.com/order/1/delete

или даже хуже

POST http://example.com/deleteOrder/id/1

эффективное туннелирование семантики CRUD через HTTP. Но глаголы никогда не должны были быть частью URI. Вместо этого HTTP уже предоставляет механизм и семантику для CRUD ресурса (например, заказа) через методы HTTP. HTTP - это протокол, а не просто служба туннелирования данных.

Итак, чтобы удалить ресурс на веб-сервере, вы должны вызвать

DELETE http://example.com/order/1

и чтобы обновить его, вы бы позвонили

PUT http://example.com/order/1

и предоставить обновленное представление ресурса в теле PUT, чтобы веб-сервер затем применил его.

Итак, если вы создаете своего рода клиент для REST API , вы, скорее всего, заставите его отправлять запросы PUT и DELETE. Это может быть клиент, встроенный в браузер, например, отправляющий запросы через JavaScript, или это может быть какой-то инструмент, работающий на сервере и т. Д.

Для получения более подробной информации посетите:

Гордон
источник
7
Браузеры могут отправлять PUT и DELETE с помощью JavaScript!
Джо
5
@Joe Да, но методы HTML-форм - нет. И пока это не поддерживается из коробки, вы должны пройти через обручи, чтобы заставить его работать. Это одна из главных неудач производителей браузеров.
Гордон
3
Конечно, нет, формы предназначены для POST и GET. Это в дизайне HTML. Неверно сказать, что PUT и DELETE не поддерживаются. Браузеры реализуют HTML и HTTP.
Джо
@Joe, тогда у нас, вероятно, нет того же определения "поддержки". Большинство браузеров поддерживают JavaScript, и да, JavaScript может выполнять HTTP-запросы, но мне все равно нужно это запрограммировать , привязать код к некоторым элементам пользовательского интерфейса и сначала доставить его клиенту.
Гордон
4
Браузер отображает пустую страницу, если вы не написали HTML. Да, возможно, мы должны не соглашаться. Не соглашаться - это нормально!
Джо
26

Использование команды HTTP-запроса, такой как GET, POST, DELETE, PUT и т. Д., Позволяет создавать веб-приложения RESTful. Об этом читайте здесь: http://en.wikipedia.org/wiki/Representational_state_transfer

Самый простой способ увидеть преимущества от этого - посмотреть на этот пример. Каждая платформа MVC имеет Router/Dispatcherсопоставление URL-адресов с контроллерами действий. Таким образом, URL-адрес, подобный этому: /blog/article/1будет вызывать blogController::articleAction($id); Теперь этот маршрутизатор знает только URL-адрес или/blog/article/1/

Но если этот маршрутизатор будет знать весь объект HTTP-запроса, а не только URL-адрес, он сможет получить доступ к команде HTTP-запроса (GET, POST, PUT, DELETE ...) и многим другим полезным материалам о текущем HTTP-запросе.

Это позволит вам настроить приложение так, чтобы оно могло принимать один и тот же URL-адрес и сопоставлять его с разными контроллерами действий в зависимости от глагола HTTP-запроса.

Например:

если вы хотите получить статью 1, вы можете сделать это:

GET /blog/article/1 HTTP/1.1

но если вы хотите удалить статью 1, вы сделаете это:

DELETE /blog/article/1 HTTP/1.1

Обратите внимание, что оба HTTP-запроса имеют одинаковый URI, / blog / article / 1, единственная разница - это команда HTTP-запроса. И на основе этого глагола ваш маршрутизатор может вызывать другой actionController. Это позволяет создавать аккуратные URL-адреса.

Прочтите эти две статьи, они могут вам помочь:

Symfony 2 - Основы HTTP

Symfony 2 - Маршрутизация

Эти статьи посвящены фреймворку Symfony 2, но они могут помочь вам понять, как работают HTTP-запросы и ответы.

Надеюсь это поможет!

Лимени
источник
6
хотя я не являюсь их другом, красиво объяснил +1 ;-)
Najzero
1
Этот ответ объясняет, как лучше всего описать важность HTTP-глаголов и соответствие действительно службам RESTful и их преимуществам. Если вы не используете, скажем, HTTP DELETE, тогда у вас может быть (2) действия POST в контроллере: 1 для Createи 1 для Delete. Если вы сделаете это, ваш следующий поиск будет « Как иметь несколько действий публикации в одном контроллере »: P. Не то чтобы это ужасно, но вы теряете возможность реализовать уникальный ресурс с помощью глагольного действия вместо того, чтобы явно указывать имя действия в URI.
atconway
3

Хотя я рискую оказаться непопулярным, я говорю, что в настоящее время они бесполезны .

Я думаю, что они были хорошо задуманы и полезны в прошлом, когда, например, DELETE сообщал серверу об удалении ресурса, найденного по указанному URL-адресу, а PUT (с его родственным PATCH) указывал серверу выполнять обновление идемпотентным образом.

Вещи развивались и URL , стал виртуальным (см перезаписи URL , например) , что делает ресурсы теряют свой первоначальный смысл реальной папки / subforder / файл и так, глаголы действия CRUD , охватываемые HTTP методов протокола (GET, POST, PUT / PATCH, DELETE) потерял .

Возьмем пример:

  • / api / entity / list / {id} против GET / api / entity / {id}
  • / api / entity / add / {id} против POST / api / entity
  • / api / entity / edit / {id} против PUT / api / entity / {id}
  • / api / entity / delete / {id} против DELETE / api / entity / {id}

Слева не написан HTTP-метод, по сути это не имеет значения (достаточно POST и GET), а с правой стороны используются соответствующие HTTP-методы.

Правая сторона выглядит элегантно, чисто и профессионально. Представьте, что теперь вам нужно поддерживать код, который использует элегантный API, и вам нужно искать, где выполняется вызов удаления. Вы будете искать «api / entity» и среди результатов увидите, какой из них выполняет DELETE. Или, что еще хуже, у вас есть младший программист, который по ошибке переключил PUT на DELETE, и с URL-адресом произошло то же самое.

На мой взгляд, включение команды действия в URL-адрес имеет преимущества перед использованием соответствующего HTTP-метода для этого действия, даже если это не так элегантно. Если вы хотите увидеть, где выполняется вызов удаления, вам просто нужно найти «api / entity / delete», и вы сразу найдете его.

Создание API без всего массива методов HTTP упрощает его последующее использование и обслуживание.

Богдан
источник
1

Безопасные методы: получение ресурса / отсутствие изменений в ресурсе
Идемпотент: отсутствие изменений состояния ресурса при многократном запросе
Небезопасные методы: создание или обновление ресурса / изменение ресурса
Неидемпотентное изменение : изменение состояния ресурса при многократном запросе

Согласно вашему требованию:

1) Для безопасной и идемпотентной операции (Fetch Resource) используйте --------- GET METHOD
2) Для небезопасной и неидемпотентной операции (Insert Resource) используйте --------- POST METHOD
3) Для небезопасной и идемпотентной операции (обновление ресурса) используйте --------- МЕТОД PUT
3) Для небезопасной и идемпотентной операции (удаление ресурса) используйте --------- МЕТОД УДАЛЕНИЯ

user1953168
источник