我还听说,其他一些来源也提到浏览器仅支持GET和POST,例如: 然而,在 Firefox 中进行一些快速测试后发现发送 PUT 和 DELETE 请求可以按预期工作 -- XMLHttpRequest 完成并且请求以正确的方法显示在服务器日志中。是否存在某些方面的限制,例如跨浏览器兼容性或非明显的限制?不幸的是,同一个浏览器都无法测试HTTP PUT、DELETE 请求,甚至 HTTP POST 请求也只能在某种程度上支持。
我还听说,其他一些来源也提到浏览器仅支持GET和POST,例如: 然而,在 Firefox 中进行一些快速测试后发现发送 PUT 和 DELETE 请求可以按预期工作 -- XMLHttpRequest 完成并且请求以正确的方法显示在服务器日志中。是否存在某些方面的限制,例如跨浏览器兼容性或非明显的限制?不幸的是,同一个浏览器都无法测试HTTP PUT、DELETE 请求,甚至 HTTP POST 请求也只能在某种程度上支持。
不支持。HTML 5规范中提到:
方法和formmethod内容属性是具有以下关键字和状态的枚举属性:
关键字get映射到GET状态,表示HTTP GET方法。GET方法只应请求和检索数据,不应产生其他效果。
关键字post映射到POST状态,表示HTTP POST方法。POST方法请求服务器接受提交表单的数据进行处理,可能导致添加项目到数据库、创建新的Web页面资源、更新现有页面或所有提到的结果。
关键字dialog映射到对话框状态,表示提交表单旨在关闭表单所在的对话框(如果有),否则不提交。
这些属性的无效值默认为GET状态
即HTML表单仅支持GET和POST作为HTTP请求方法。解决此问题的方法是通过使用一个隐藏的表单字段将其他方法隧道传输到POST中,该字段由服务器读取并相应地调度请求。
然而,XMLHttpRequest的实现(即AJAX调用)在所有主要网络浏览器(IE、Firefox、Safari、Chrome和Opera)中都支持GET、POST、PUT和DELETE。<article>
,<aside>
,<nav>
和<section>
的意思。就像我所说的一样,这是关于语义的。对于HTTP方法也是如此。请阅读规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html另外,如果你需要更实际的原因,请注意PUT
和DELETE
是幂等的,而POST
则不是。 - Ajedi32HTML表单支持GET和POST方法。(HTML5曾经添加PUT/DELETE方法,但后来被删除了。)
XMLHttpRequest 支持所有的HTTP方法,包括CHICKEN,尽管一些方法名称不区分大小写(但HTTP协议是区分大小写的),另外还有一些方法因安全原因而不被支持(例如CONNECT)。
Fetch API 也支持除CONNECT、TRACE和TRACK以外的任何方法,因为这些方法由于安全原因被禁止使用。
浏览器正在逐渐接受XMLHttpRequest指定的规则,但正如其他评论所指出的,仍存在一些差异。
XMLHttpRequest
是 JavaScript 对象模型中的标准对象。
根据维基百科,在 Internet Explorer 5 中,XMLHttpRequest
首次出现为一个 ActiveX 对象,但随后成为一种标准,并在 Mozilla 家族中的 JavaScript 1.0、苹果 Safari 1.2、Opera 7.60-p1 和 IE 7.0 中被包含供使用。
该对象上的 open()
方法 接受 HTTP 方法作为参数,并被规定可以接受任何有效的 HTTP 方法(参见链接中的第 5 条)——包括 GET
、POST
、HEAD
、PUT
和 DELETE
,正如 RFC 2616 规定的那样。
_method
隐藏字段解决方案
用于Rails,也可以适用于任何框架:
在任何非 GET 或 POST 的表单中添加一个隐藏的 _method
参数:
<input type="hidden" name="_method" value="DELETE">
这可以通过框架中的HTML创建助手方法(例如Rails form_tag
)自动完成。
将实际表单方法修复为POST(<form method="post"
)
在服务器上处理_method
,并像发送了该方法一样执行实际的POST操作。
为什么不可能的原因 / 历史: https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms
我认为这些评论特指浏览器,即点击链接和提交表单,而不是XMLHttpRequest
。 XMLHttpRequest
只是使用浏览器作为运行时的JavaScript中自定义的客户端。
更新:为了澄清,我的意思并不是(尽管我写了)你编写了XMLHttpRequest
,我指的是你编写了使用XMLHttpRequest
的代码。浏览器不原生支持XMLHttpRequest
。 XMLHttpRequest
来源于JavaScript运行时,可能由浏览器托管,但并非必须如此(请参见Rhino)。这就是为什么人们说浏览器不支持PUT
和DELETE
- 因为实际上是JavaScript在支持它们。
是的,PUT、DELETE、HEAD等HTTP方法在现代浏览器中都可以使用。
为了符合XMLHttpRequest Level 2标准,浏览器必须支持这些方法。要检查哪些浏览器支持XMLHttpRequest Level 2,我推荐使用CanIUse:
目前只有Opera Mini不支持(截至'15年7月),但是Opera Mini什么都不支持。 :)
补充一下- Safari 2及更早版本明确不支持PUT和DELETE。我有印象Safari 3支持,但我不再有它来进行测试了。 Safari 4肯定支持PUT和DELETE。