为啥浏览器不支持 PUT 和 DELETE 请求,啥时候支持?

Posted

技术标签:

【中文标题】为啥浏览器不支持 PUT 和 DELETE 请求,啥时候支持?【英文标题】:Why don't browsers support PUT and DELETE requests and when will they?为什么浏览器不支持 PUT 和 DELETE 请求,什么时候支持? 【发布时间】:2013-05-24 05:53:03 【问题描述】:

我最近看到许多框架决定在表单提交(不是 ajax)中“伪造”PUT 和 DELETE 请求。就像 Ruby on Rails 一样。他们似乎在等待浏览器赶上来。他们是在徒劳地等待吗?

这甚至计划在任何地方实施吗?

【问题讨论】:

哪些浏览器级别的操作需要PUTDELETE 语义?您已经可以以编程方式生成 HTTP PUTDELETE 操作。只是我无法想象如何在浏览器中将这些公开给用户(它会做什么?PUT 当您将文件拖到浏览器中时?) 它们在 html5 和 Ajax 请求中受支持。 @N1xx1 所以在 html5 中我可以做到
?甜的。我会调查一下。
@N1xx1 似乎您不能在表单元素中使用 put/delete。 w3.org/TR/2010/WD-html5-diff-20101019/#changes-2010-06-24 【参考方案1】:

浏览器确实支持PUTDELETE,但HTML不支持。

例如,浏览器将通过 javascript (AJAX) 发起 PUT 请求,但不会通过 HTML <form> 提交。

这是因为 HTML 4.01 和最终的 W3C HTML 5.0 规范都规定其 form 元素应允许的唯一 HTTP 方法是 GET 和 POST。

在 HTML 5 的开发过程中对此进行了很多讨论,有一次它们被添加到 HTML 5 中,但又被删除了。从 HTML 5 规范中删除附加方法的原因是因为 HTML 4 级浏览器永远无法支持它们(在它们被制作时不是 HTML 的一部分);如果没有 JavaScript shim,就无法让他们这样做;因此,您不妨使用 AJAX。

尝试使用带有method="PUT"method="DELETE" 的表单的网页将退回到所有当前浏览器的默认方法GET。这会破坏 Web 应用程序在 HTML 表单中使用适当方法来执行预期操作的尝试,并最终给出更糟糕的结果——GET 被用于删除内容! (你好爬虫。哦,哎呀!我的数据库去了)

将 HTML <form> 元素的默认方法更改为 POST 会有所帮助(自 Moasic* 于 1993 年首次推出表单以来,IMO 的默认值应始终为 POST),但更改默认值至少需要十年来渗透到已安装的基础上。所以用两个词来说:“因为遗产”。 :-(

为了支持当前的浏览器,作者必须通过覆盖来伪造它。我建议作者使用广为人知的a, b_method 参数,在他们的 HTML 中包含 <input type=hidden name=_method value=DELETE>;将表单方法切换为POST(因为请求不安全);然后在服务器端添加对 _method 的识别,然后它应该做任何必要的事情来改变请求并将其转发,就好像它是一个真正的 DELETE 请求一样。

还要注意,由于 Web 浏览器是最终的 HATEOAS 客户端,因此它们需要有一个 新状态 才能传输给它们以进行 DELETE 请求。对于此类请求,现有 API 通常会返回 204 No Content。相反,您应该发回带有链接的超媒体响应,以便用户可以改进他们的浏览器状态。

另请参阅这些类似/相同问题的答案:

Why are there are no PUT and DELETE methods on HTML forms? Are the PUT, DELETE, HEAD, etc methods available in most web browsers? Using PUT method in HTML form Do Browsers support PUT requests with multipart/form data


* Marc Andreessen 创建的 Mosaic 还引入了<img src=…> 标签的复合错误——它应该是<image source=…>fallback</image>

【讨论】:

以上是关于为啥浏览器不支持 PUT 和 DELETE 请求,啥时候支持?的主要内容,如果未能解决你的问题,请参考以下文章

在web前端怎么发送http协议的put delete请求

(转)SpringMvc如何使用form发送PUT和DELETE请求

AJAX:POST-PUT-DELETE的问题

Delete 和 Put 请求失效, Spring 框架

WebAPI IIS PUT和DELETE请求失败

WebAPI IIS PUT和DELETE请求失败 405