为什么HTML表单上没有PUT和DELETE方法?


265

HTML4 / XHTML1仅允许以表格形式进行GET和POST,现在看来HTML5会做同样的事情。有提议将这两个添加,但似乎并没有获得吸引力。在HTML5规范草案中不包含PUT和DELETE的技术或政治原因是什么?


7
HTML是标记语言,HTTP是协议
棘手怪胎

51
@棘手怪胎:我知道。尽管如此,我还是特别询问HTML,因为它仅将GET和POST定义为允许的<form>方法。
FilipK 2011年

一种典型的情况是具有表格数据的表单,其中用户需要或不需放置更多行,因为“更多行”是用户决定的。使用Javascript + POST是人工的,也许HTML6将显示替代的FORM功能来执行这种操作。
彼得·克劳斯

当有人在Stack Overflow上问了这个问题时,我回答了这个问题,并觉得我的贡献对上面的出色回答有所帮助,对于任何在页面下端阅读此内容的人:o)为什么浏览器不支持PUT和DELETE请求,以及他们什么时候?
Nicholas Shanks

Answers:


348

这是一个有趣的问题。这里的其他答案都是推测性的,在某些情况下完全不正确。实际上,我没有做任何调查,而是进行了一些研究,发现了讨论删除放置为什么不属于HTML5表单标准的原始资料。

事实证明,这些方法包含在多个HTML5早期草稿(!)中,但后来在后续草稿中被删除。Mozilla实际上也在Firefox beta中实现了这一点。

从草案中删除这些方法的理由是什么?W3C在错误报告10671中讨论了此主题。Mike Amundsen赞成这种支持:

对于使用XmlHttpRequest对象的现代Web浏览器,直接执行PUT和DELETE来修改原始服务器上的资源。对于未脚本化的浏览器交互,这并不是那么简单。[...]

经常需要这种模式,因此几个常用的Web框架/库创建了“内置”解决方法。[...]

其他注意事项:

  • 使用POST作为隧道而不是PUT / DELETE会导致缓存不匹配(例如POST响应是缓存的,PUT响应不是(6),DELETE响应不是(7))
  • 使用非幂等方法(POST)执行幂等操作(PUT / DELETE)会使由于网络故障而导致的恢复复杂化(例如,“可以安全地重复此操作吗?”)。
  • [...]

值得阅读他的整个帖子。

汤姆·沃洛德(Tom Wardrop)也提出了有趣的观点:

HTML与HTTP有着千丝万缕的联系。HTML是HTTP的人机界面。因此,自动质疑为什么HTML不支持HTTP规范中的所有相关方法。为什么可以机器放置和删除资源,而人类却不能?[...]

矛盾的是,尽管HTML竭尽全力确保语义标记,但迄今为止,它并没有做出任何努力来确保语义HTTP请求。

该错误最终由伊恩·希克森(Ian Hickson)修复“无法修复”,其依据如下:

将PUT作为一种表单方法毫无意义,您不希望将PUT放置为表单有效内容。DELETE仅在没有有效负载的情况下才有意义,因此对于表单也没有太大意义。

但是,这还不是故事的结局!该问题已在W3C错误跟踪器中关闭,并升级为HTML工作组问题跟踪器:

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

在这一点上,似乎似乎不支持这些方法的主要原因仅仅是没有人花时间为它编写全面的规范。


70
+1用于进行研究工作,并挖掘大量外部参考文献以正确回答问题。

6
@shivakumar我想您真正要问的是,当JavaScript已经可以完成这项工作时,为什么还要打扰HTML?这是一个公平的问题。我猜OP的问题更多是出于好奇而不是实用性。HTML和HTTP是彼此对应的两个标准,但是HTML似乎并未意识到HTTP的某些最基本属性。“为什么?” 这是一个自然的问题。
Mark E. Haase 2014年

23
当然,您必须包括用于PUT的有效负载,而对于DELETE则可能吗?此外,如果“没有多大意义与形式”,那么为什么人们问它为什么做了很多,如果软件解决方法,他建在奇怎么一个人可以只决定什么世界其他地区的需要或想要...
乔纳森

4
@mehaase另外,也许只是我一个人,但是我认为与表达对提案的一般支持相比,邮件列表是一个更好讨论的地方。我不愿意在public-html-comments邮件列表上启动新线程,所以我可以说“我喜欢这个提议;表单应该能够使用其他HTTP方法”。作为一个在现代网络上长大的人,我想知道的是:“ upvote按钮在哪里?” ;-)
Ajedi32

6
@ Ajedi32的帖子如下:lists.w3.org/Archives/Public/public-html/2015Feb/0000.html我鼓励每个有兴趣在public-html邮件列表上回复此帖子的人。
Mark E. Haase 2015年

12

GET和POST具有与内容无关的明确理由。GET是一种可以安全重复和缓存的方式检索URL的内容。POST以一种不安全的方式进行重复,推测性执行或缓存的方式。

对于PUT或DELETE没有类似的理由。它们都完全由POST覆盖。创建或销毁资源是不安全的重复操作,也不可靠地执行推测性操作,因此不应进行缓存。它们不需要其他特殊的语义。

因此,基本上没有任何好处。


22
尽管POST涵盖了PUT和DELETE,但我仍然可以看到使用单独方法的好处。所有这些都包含在HTTP规范中,并且在REST中鼓励使用它们。
FilipK 2011年

10
@David:那将是一个功能
Donal Fellows,

15
理由是POST和DELETE具有不同的含义-几乎相反-含义。您声称POST完全涵盖了DELETE,但是POST不是幂等而DELETE是。您如何解释?w3.org/Protocols/rfc2616/rfc2616-sec9.html
Mark E. Haase

14
巧妙的类比,但您正在重新定义“封面”的含义。在原始答案中,您的意思是“涵盖”,例如“支持所有相同的用例”。在这里,您正在重新定义“封面”以表示某种分类关系。让我们切入语言:由于幂等性的差异,POST不支持与DELETE相同的用例。由于语义不同,GET不支持与DELETE相同的用例。对DELETE的支持将增加用户代理功能。
Mark E. Haase 2013年

13
我不同意这个答案。POST不是幂这就是为什么当你点击浏览器“返回”,它会显示一个丑陋的页面,上面写着形式需要重新发送。但是,如果是PUT,它可以安全地重新发送PUT请求以显示您应该获得的任何页面。当然,只要创建一种,就不会弄乱API DELETE /resource/latest
arg20 2014年

12

由于Bug 10671考虑添加对PUT和DELETE的支持作为表单方法,因此在2010年提出了此问题。

对于此“功能”有一些适度的回推,并且有些笨拙,但最终在工作组错误跟踪程序上这被升级为两个问题:

ISSUE-196问题导致共识决定,不对规范进行任何更改,因为HTML规范当前不限制对POST请求的响应的处理方式。我认为,在尝试协调常用的POST重定向模式以及ReSTful服务器通常如何以短消息提供2xx响应而不是有用的东西在浏览器中呈现时,会引发此特定问题。

ISSUE-195问题已提交给主席。卡梅隆·琼斯(Cameron Jones)于2012年1月18日加紧志愿服务,撰写了一份变更建议,并于2014年5月29日提交成为第一份工作草案。该草案将通过W3C建议流程

运气好的话,这将很快成为W3C的建议并由浏览器供应商实施,并且将是移除阻止程序以产生统一,语义和浏览器友好的ReSTful服务的一大进步。我认为这将引发服务模式的有趣变化。乔恩·摩尔Jon Moore)有个很好的演讲-值得一看的超媒体API,这引起了我的兴趣,但在第一个障碍(这个障碍)上落下了脚步。


5

我的理解是,浏览器发送PUT或DELETE后不知道该怎么办。POST通常会重定向到适当的页面,但PUT和DELETE通常不会。这使它们适合通过ajax或本机程序进行调用,但不适用于Web浏览器表单。

我现在不能阻止它,但是我记得当他们讨论此内容时,阅读了其中一个html5邮件列表。


4
是否有原因导致PUT和DELETE无法或不以与POST相同的方式重定向?
瑞安H

3
@maxpolun这可能是你指的是邮件列表:lists.w3.org/Archives/Public/public-html-wg-issue-tracking/...
jordanbtucker

2
@RyanH没有。我遇到的每个发送删除请求的应用都会回复并重定向到索引。
Qwertie

5

历史

我认为值得一提的是RFC1866(第8.1节)中html表单的首次出现。这里的method属性定义如下:

METHOD
        selects a method of accessing the action URI. The set of
        applicable methods is a function of the scheme of the
        action URI of the form. See 8.2.2, "Query Forms:
        METHOD=GET" and 8.2.3, "Forms with Side-Effects:
        METHOD=POST".

有关更多说明,请参见第8.2.2 节-GET第8.2.3节-POST。

请记住,HTML 2.0(1995年11月)是 HTTP 1.0(1996年5月)之前指定的。因此,每个人仅将HTTP与GET(从HTTP 0.9开始)或扩展名POST一起使用。但是只有少数Web服务器支持PUT和DELETE(如HTTP 1.0附录中所述)。

思想

如果您考虑一下Berners-Lee语义网的发展是如何发展的,那么显然它已经从实际问题变成了一般概念。首先,他想共享文档。因此,他需要加价。然后,他想在数据库中查询内容,因此他需要表格。然后,他想将新数据放入数据库。因此,他在GET和POST中使用了表格。之后,他可能意识到您可以对远程数据执行所有CRUD操作,因此对HTTP进行了扩展,但从未扩展HTML,因为为时已晚(只有少数服务器支持新的CRUD操作)。


-2

只是引发了一个疯狂的猜测,但这可能是因为HTTP在最佳情况下在访问控制方面并不是很出色,而且每个人需要的最后一件事是恶意URL危害安全性差的网站和/或应用程序的更多方法。

除了从服务器下载到客户端以外,HTTP并不是用于文件传输的好协议。使用FTP-或使用SFTP更好。


12
安全对此没有影响。您仍然可以通过HTTP发出PUT / Delete请求。curl --request PUT http://A.B.c/index问题是为什么您可以通过HTML访问这些命令。
马丁·约克

5
-1疯狂的猜测通常对SO没有帮助。
Mark E. Haase 2013年

-4

获取和发布是传输请求数据的格式。

我想您正在询问将表单提交到RESTFUL服务中的问题。但是,更改http请求标准以假设http请求的目的没有意义。有关请求填充目的的信息最好在输入字段中处理。

具有地址以及获取和发送信息可以使服务器正确解释请求及其输入值。从那里,输入值使您可以向服务器发出开放式请求,并根据需要进行操作。例如,您可以有一个值为“ put”和“ delete”的字段


5
-1“获取和发布是传输请求数据的格式。” 不,它们是HTTP方法,而不是“格式”。
Mark E. Haase 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.