Почему в HTML-формах нет методов PUT и DELETE?

HTML4 /XHTML1 разрешает только GET и POST в формах, теперь кажется, что HTML5 сделает то же самое. Существует предложение добавить эти два, но похоже, что это не тянет. Каковы были технические или политические причины не включать PUT и DELETE в проект спецификации HTML5?

230 голосов | спросил FilipK 13 +04002011-10-13T16:34:50+04:00312011bEurope/MoscowThu, 13 Oct 2011 16:34:50 +0400 2011, 16:34:50

7 ответов


301

Это интересный вопрос. Другие ответы здесь - все спекулятивные, а в некоторых случаях неверные. Вместо того, чтобы писать свое мнение здесь, я действительно сделал некоторые исследования и нашел оригинальные источники, которые обсуждают, почему delete и put не являются частью стандарта формы HTML5.

Как оказалось, эти методы были включены в несколько ранних черновиков HTML5 (!), но позже были удалены в последующие проекты . Mozilla действительно реализовала этот в бета-версии Firefox .

В чем заключалось обоснование удаления этих методов из проекта? W3C обсудил этот вопрос в сообщении об ошибке 10671 . Майк Амундсен утверждал в пользу этой поддержки:

  

Выполнение PUT и DELETE для изменения ресурсов на исходном сервере прямолинейно для современных веб-браузеров с использованием объекта XmlHttpRequest. Для неписанных взаимодействий браузера это не так просто. [...]

     

Этот шаблон требуется так часто, что несколько широко используемых веб-фреймворков /библиотек создали «встроенную» рабочую среду. [...]

     

Другие соображения:

     
  • Использование POST в качестве туннеля вместо использования PUT /DELETE может привести к кэшированию неверных совпадений (например, ответы POST cachable , ответы PUT не являются (6), ответы DELETE не являются (7))
  •   
  • Использование метода non-idempotent (POST) для выполнения идемпотентной операции (PUT /DELETE) усложняет восстановление из-за сбоев сети (например, «Можно ли повторить это действие?»).
  •   
  • [...]
  •   

Стоит прочитать весь свой пост.

Том Уордроп также делает интересную мысль:

  

HTML неразрывно связан с HTTP. HTML - это человеческий интерфейс HTTP. Поэтому автоматически возникает вопрос, почему HTML не поддерживает все соответствующие методы в спецификации HTTP. Почему машины могут запускать и удалять ресурсы, но люди не могут? [...]

     

Противоречие в том, что в то время как HTML идет на большие длины для обеспечения семантической разметки, на сегодняшний день он не сделал таких усилий для обеспечения семантических HTTP-запросов.

Ошибка была в конечном счете закрыта как Не исправлена ​​ Яном Хиксоном со следующим обоснованием:

  

PUT как метод формы не имеет никакого смысла, вы не захотите ОТКЛЮЧИТЬ полезную нагрузку формы. DELETE имеет смысл только в том случае, если нет полезной нагрузки, поэтому он не имеет особого смысла и в формах.

Однако, это еще не конец истории! Проблема была закрыта в трекерах отслеживания ошибок W3C и escalated для отслеживания проблем в рабочей группе HTML:

https://www.w3.org/html/wg/tracker/issues/195

На данный момент кажется, что основной причиной отсутствия поддержки этих методов является то, что никто не нашел времени, чтобы написать для него исчерпывающую спецификацию.

ответил Mark E. Haase 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 17 Sep 2013 23:39:44 +0400 2013, 23:39:44
12

GET и POST имеют четкое нейтральное содержание. GET - это получение содержимого URL-адреса безопасным образом и, возможно, кэширование. POST должен сделать что-то таким образом, что небезопасно повторять, выполнять спекулятивно или кешировать.

Не было похожего обоснования для PUT или DELETE. Они оба полностью покрыты POST. Создание или уничтожение ресурса - это операции, которые небезопасно повторять, а не безопасно выполнять спекулятивно и не должны кэшироваться. Для них не требуется специальной специальной семантики.

Так что в принципе нет никакой пользы.

ответил David Schwartz 13 +04002011-10-13T17:13:09+04:00312011bEurope/MoscowThu, 13 Oct 2011 17:13:09 +0400 2011, 17:13:09
9

Это было поднято в 2010 году как Ошибка 10671 рассмотрите возможность добавления поддержки PUT и DELETE в качестве методов формы .

Было небольшое количество pushback для этой «функции» и некоторой тяжеловесности, но в конечном итоге это было увеличено как два вопроса в трекерах рабочих групп:

Проблема ISSUE-196 привела к принятию окончательного решения об изменении спецификации поскольку спецификация HTML в настоящее время не ограничивает обработку ответов на запросы POST. Я считаю, что эта особая проблема была поставлена ​​в попытке примирить шаблоны перенаправления POST, которые обычно используются, и как серверы ReSTful часто предоставляют ответы 2xx короткими сообщениями, а не что-то полезное для визуализации в браузере.

Председателю были представлены выпуск ISSUE-195 . Кэмерон Джонс активизировала работу по написанию предложения о внесении изменений 18 января 2012 года, которое он представил, чтобы стать первый рабочий проект от 29 мая 2014 года. Проект будет проходить через W3C .

В любом случае это скоро станет рекомендацией W3C и будет реализовано разработчиками браузеров и станет отличным шагом в устранении блокировщиков для создания унифицированных, семантических и дружественных браузерам сервисов ReSTful. Я предполагаю, что это вызовет интересную эволюцию в шаблонах обслуживания. Хороший разговор от Jon Moore - API Hypermedia стоит посмотреть, это вызвало мой интерес, но упало при первом препятствии (этот).

ответил Stuart Wakefield 6 SatEurope/Moscow2014-12-06T13:00:57+03:00Europe/Moscow12bEurope/MoscowSat, 06 Dec 2014 13:00:57 +0300 2014, 13:00:57
5

Я понимаю, что браузеры не знают, что делать после отправки PUT или DELETE. Обычно POST перенаправляет на соответствующую страницу, но PUT и DELETE обычно этого не делают. Это делает их подходящими для вызова через ajax или собственную программу, но не из формы веб-браузера.

Я не могу отложить это прямо сейчас, но я помню, как читал один из списков рассылки html5, когда они обсуждали это.

ответил maxpolun 13 +04002011-10-13T19:50:10+04:00312011bEurope/MoscowThu, 13 Oct 2011 19:50:10 +0400 2011, 19:50:10
5

История

Я думаю, что стоит упомянуть о первом появлении html-форм в RFC1866 (раздел 8.1) . Здесь атрибут метода определяется следующим образом:

МЕТОД
        выбирает способ доступа к URI действия. Набор
        применимые методы являются функцией схемы
        URI действия формы. См. 8.2.2, «Формы запросов:
        METHOD = GET "и 8.2.3," Формы с побочными эффектами:
        METHOD = POST».

Дальнейшие объяснения находятся в разделе 8.2.2 - GET и Раздел 8.2.3 - POST

Имейте в виду, что HTML 2.0 (ноябрь 1995 г.) был указан до HTTP 1.0 (май 1996 г.). Таким образом, все использовали HTTP только с GET (по HTTP 0.9) или с расширением POST. Но только несколько веб-серверов поддерживают PUT и DELETE (как указано в HTTP 1.0 Приложение ).

Мысли

Если вы думаете о том, как развитие Бернса-Ли в семантической сети могло развиться, кажется ясным, что он перешел от реальных проблем к общей концепции. Сначала он хотел поделиться документами. Поэтому ему нужна разметка. Затем он хотел запросить базы данных для контента, поэтому ему нужны были формы. Затем он хотел поместить новые данные в базу данных. Поэтому он использовал формы с GET и POST. После этого он, возможно, понял, что вы можете выполнять каждую операцию CRUD на удаленных данных, поэтому HTTP был расширен, но никогда не был HTML, потому что было слишком поздно (только несколько серверов поддерживали новые операции CRUD).

ответил schmijos 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 16:26:10 +0400 2014, 16:26:10
-2

Просто выкидывает дикое предположение, но, вероятно, потому, что HTTP не очень хорош с контролем доступа в лучшие времена, и последнее, что нужно всем, - это даже больше , чтобы вредоносные URL-адреса могли нарушить плохо защищенный веб-сайт и /или приложение.

HTTP не является хорошим протоколом для передачи файлов, кроме загрузки с сервера на клиент. Используйте FTP - или еще лучше, SFTP.

ответил Shadur 13 +04002011-10-13T16:42:02+04:00312011bEurope/MoscowThu, 13 Oct 2011 16:42:02 +0400 2011, 16:42:02
-4

Get и post - это форматы передачи данных запроса.

Я предполагаю, что вы спрашиваете о том, как отправить форму в службу RESTFUL. Но не имеет смысла изменять стандарт запроса HTTP, чтобы сделать предположения целью HTTP-запроса. Информация о цели, которую заполняет запрос, лучше всего обрабатывать в полях ввода.

Наличие адреса и получения и публикации позволяет серверу правильно интерпретировать запрос и его входные значения. Оттуда входные значения позволяют вам делать запросы с открытым концом на сервер и делать то, что вы хотите. Например, вы можете иметь поле, значения которого «put» и «delete»

ответил Joe 13 +04002011-10-13T22:55:53+04:00312011bEurope/MoscowThu, 13 Oct 2011 22:55:53 +0400 2011, 22:55:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132