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

Почему браузеры не поддерживают запросы PUT и DELETE, и когда они будут?

В последнее время я вижу множество фреймворков, которые решили "подделывать" запросы PUT и DELETE. Как Ruby on Rails. Кажется, они ожидают, что браузеры наверстают упущенное. Они тщетно ждут?

Возможно ли, что это будет реализовано где угодно?

4b9b3361

Ответ 1

Браузеры поддерживают PUT и DELETE, но это не HTML.

Например, браузер будет инициировать запрос PUT через Javascript (AJAX), но не через HTML <form>.

Это связано с тем, что HTML 4.01 и окончательная спецификация W3C HTML 5.0 говорят, что единственными методами HTTP, которые должны разрешать их элементы form являются GET и POST.

Об этом много говорили во время разработки HTML 5, и в какой-то момент они были добавлены в HTML 5, но затем снова были удалены. Причина, по которой дополнительные методы были удалены из спецификации HTML 5, заключается в том, что браузеры уровня HTML 4 никогда не могли их поддерживать (не являясь частью HTML на момент их создания); и нет никакого способа позволить им сделать это без JavaScript-прокладки; таким образом, вы также можете использовать AJAX.

Веб-страницы, пытающиеся использовать формы с method="PUT" или method="DELETE", вернутся к методу по умолчанию, GET для всех текущих браузеров. Это ломает попытки веб-приложений использовать подходящие методы в формах HTML для предполагаемого действия и приводит к худшему результату - GET используется для удаления вещей! (Привет, гусеничный. ой, ой! вот моя база данных)

Помогло бы изменение метода по умолчанию для элементов HTML <form> на POST (IMO по умолчанию всегда должно было быть POST, с тех пор как Moasic * дебютировал в 1993 году), но для изменения значения по умолчанию потребовалось бы по крайней мере десятилетие, чтобы просочиться через установленный база. Итак, в двух словах: "потому что наследие. :-(

Для поддержки текущих браузеров авторам придется подделать его с помощью переопределения. Я рекомендую авторам использовать широко известный аргумент a, b_method, включив <input type=hidden name=_method value=DELETE> в свои HTML; переключить метод формы на POST (поскольку запрос небезопасен); затем добавьте распознавание _method на стороне сервера, которое затем должно сделать все необходимое, чтобы изменить запрос и переслать его, как если бы это был настоящий запрос DELETE.

Также обратите внимание, что, поскольку веб-браузеры являются конечным клиентом HATEOAS, они должны иметь новое состояние, которое должно быть передано им для запросов DELETE. существующие API часто возвращают 204 No Content для таких запросов. Вместо этого вы должны отправить ответ гипермедиа со ссылками, чтобы пользователь мог улучшить состояние своего браузера.

Также посмотрите ответы на эти похожие/идентичные вопросы:


* Мозаика, созданная Марком Андреессеном, также внесла сложную ошибку <img src=…> - это должен был быть <image source=…>fallback</image>.