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

评论

HTML是标记语言,HTTP是协议

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

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

当有人在Stack Overflow上问了这个问题时,我回答了这个问题,并感到我的贡献对上面的出色回答有帮助。他们什么时候来?

这仍然有效吗? w3.org/TR/form-http-extensions/#http-delete-form

#1 楼

这是一个有趣的问题。这里的其他答案都是推测性的,在某些情况下完全不正确。实际上,我没有做任何研究,而是进行了研究,发现了原始资料,讨论了为什么删除和放置不属于HTML5表单标准的一部分。 ,是早期的HTML5草案(!),但后来在后续的草案中被删除。 Mozilla实际上也已经在Firefox beta中实现了此功能。

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


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

由于经常需要这种模式,因此几个常用的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

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

评论


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

–user53019
2013年9月17日19:53

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

– Mark E. Haase
2014年8月28日在17:21



当然,您必须包括一个用于PUT的有效负载,而对于DELETE则可能吗?同样,如果“对表单没有多大意义”,那么人们为什么要提出要求,以及如果他内置了解决方法,为什么还要这样做呢?

–乔纳森。
2014年9月2日上午10:30

@ Ajedi32我通过电子邮件发送了Cameron Jones(当前草案的编辑),并询问了他的状态。他写道:“该规范仍然有效,并且正在W3C流程中不断发展-它目前正在起草中,下一步是希望将其纳入候选推荐书(CR)中。”他还写道:“其中的主要因素是社区的利益……如果您和其他人有兴趣看到此实施方法,我绝对建议您通过public-html评论,whatwg或供应商拥有的邮件列表来提倡这样做。”

– Mark E. Haase
2015年2月4日在17:43



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

– Mark E. Haase
2015年2月6日14:11在

#2 楼

这个错误是在2010年提出的,因为Bug 10671考虑添加对PUT和DELETE的支持,作为表单方法。最终,这被升级为工作组错误跟踪程序上的两个问题:


ISSUE-195:增强了从表单生成HTTP请求的过程
ISSUE-196:定义了用户代理HTTP响应处理行为

问题ISSUE-196导致共识决定,不对规范进行任何更改,因为HTML规范当前不限制对POST请求的响应的处理方式。我认为,在尝试协调常用的POST重定向模式以及ReSTful服务器通常如何以短消息提供2xx响应而不是在浏览器中呈现有用内容时,会引发此特定问题。 -195被提交给主席。卡梅伦·琼斯(Cameron Jones)于2012年1月18日加紧自愿,撰写了一份变更建议,并于2014年5月29日提交成为第一份工作草案。该草案将通过W3C建议程序。运气好的话,这将很快成为W3C的建议并由浏览器供应商实施,并且将是移除阻止程序以产生统一,语义和浏览器友好的ReSTful服务的一大进步。我认为这将引发服务模式的有趣变化。乔恩·摩尔(Jon Moore)有个很好的演讲-值得一看的超媒体API,这引起了我的兴趣,但在第一个障碍(这个障碍)上落下了。

#3 楼

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

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

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

评论


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

– FilipK
2011-10-13 13:23

@David:那是一个功能。

–研究员
2011年10月13日在15:42

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

– Mark E. Haase
2013年9月17日在18:27

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

– Mark E. Haase
2013年9月17日18:53

我不同意这个答案。 POST不是幂等的,这就是为什么当您在浏览器中单击“返回”时,它将显示一个丑陋的页面,指出需要重新发送该表单。但是,如果它是一个PUT,它可以安全地重新发送PUT请求以显示您应该获得的任何页面。当然,只要创建一种DELETE / resource / latest,就不会弄乱API。

–arg20
14年8月20日在2:54

#4 楼

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

评论


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

– Ryan H
2012年6月8日下午0:03

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

–jordanbtucker
2012年8月2日,下午5:22

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

– Qwertie
18年8月28日在1:06

#5 楼

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

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附录中所述)。从实际问题变成了一般概念。首先,他想共享文档。因此,他需要加价。然后他想在数据库中查询内容,因此他需要表格。然后,他想将新数据放入数据库。因此,他在GET和POST中使用了表格。之后,他可能已经意识到您可以对远程数据执行所有CRUD操作,因此扩展了HTTP,但从未扩展HTML,因为为时已晚(只有少数服务器支持新的CRUD操作)。

#6 楼

只是引发了一个疯狂的猜测,但这可能是因为HTTP在最好的情况下在访问控制方面并不是很出色,而且每个人需要的最后一件事是恶意URL危害安全性差的网站和/或应用程序的更多方法。 br />
除了从服务器下载到客户端以外,HTTP并不是用于文件传输的好协议。使用FTP-或使用SFTP更好。

评论


安全与此无关。您仍然可以通过HTTP发出PUT / Delete请求。 curl --request PUT http://A.B.c/index问题是为什么您可以通过HTML访问这些命令。

–马丁·约克
2011-10-13 14:40

-1一般的猜测通常对SO没有帮助。

– Mark E. Haase
2013年9月17日18:30在

#7 楼

Get和post是传输请求数据的格式。

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

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

评论


-1“获取和发布是传输请求数据的格式。”不,它们是HTTP方法,而不是“格式”。

– Mark E. Haase
2013年9月17日18:31