为什么浏览器不支持PUT和DELETE请求,以及它们何时会支持?

39

最近我看到很多框架都决定在表单提交中“伪造”PUT和DELETE请求,比如Ruby on Rails。它们似乎正在等待浏览器跟进,但是它们等的结果是否会令人失望?

这个功能是否已经在任何地方被实现了呢?


1
哪些浏览器级别的操作需要使用 PUTDELETE 语义?您已经可以以编程方式生成 HTTP 的 PUTDELETE 操作。只是我无法想象如何将这些操作暴露给浏览器中的用户(当您将文件拖入浏览器时会发生什么?会执行 PUT 操作吗?) - Gian
它们在HTML5和Ajax请求中都得到了支持。 - n1xx1
@N1xx1 所以在HTML5中,我可以这样做<form action="comments/1" method="delete">?太好了。我会研究一下的。 - pixelearth
@N1xx1,看起来您不能在表单元素中使用put/delete。http://www.w3.org/TR/2010/WD-html5-diff-20101019/#changes-2010-06-24 - pixelearth
1个回答

76

浏览器 支持 PUTDELETE 方法,但是它们的使用不符合 HTML 规范。

例如,浏览器可以通过 Javascript(AJAX)发起 PUT 请求,但不能通过 HTML <form> 提交表单。

这是因为 HTML 4.01 和 W3C HTML 5.0 规范中规定,form 元素只能允许 GET 和 POST 方法。

在 HTML 5 开发过程中对此进行了广泛的讨论,一度将其他方法添加到了 HTML 5 中,但最终又被移除了。之所以从 HTML 5 规范中删除了这些额外的方法,是因为 HTML 4 级别的浏览器无法支持它们(它们当时还不是 HTML 的一部分),也没有其他方式使其能够支持,除非使用 JavaScript shim;因此,最好使用 AJAX 来实现。

使用 method="PUT"method="DELETE" 的表单将会被所有当前浏览器回退到默认方法 GET,这会破坏网页应用程序尝试使用 HTML 表单中适当的方法执行预期操作的尝试,并导致更糟糕的结果——使用 GET 方法来删除东西!(搜索引擎爬虫你好,哎呀,我的数据库没了)。

将 HTML <form> 元素的默认方法更改为 POST 可以解决这个问题(我认为自从 Mosaic* 在 1993 年首次推出表单后,应该一直将默认值设为 POST),但要更改默认值需要至少十年时间才能在已安装的基础上渗透。所以可以用两个词来描述:‘因为遗留问题’。 :-(

为了支持当前的浏览器,作者将必须使用覆盖方法来模拟。我建议作者使用广泛知名的a, b _method参数,在HTML中包含<input type=hidden name=_method value=DELETE>; 将表单方法切换为POST(由于请求是不安全的); 然后在服务器端添加对_method的识别,这应该会做出必要的更改并将其转发,就好像它是一个真正的DELETE请求一样。
还要注意,由于Web浏览器是终极的HATEOAS客户端,它们需要有一个新的状态来传递给它们进行DELETE请求。现有的API通常针对这种请求返回204 No Content。您应该发送带有链接的超媒体响应,以便用户可以推进其浏览器状态。
此外,请参阅以下类似/相同的问题的答案:
马克·安德森创造的Mosaic还引入了一个错误,即<img src=…>标记的复合错误——它应该是<image source=…>fallback</image>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接