大多数网络浏览器都支持PUT、DELETE、HEAD等方法吗?

635
我看到这里有一些问题,比如像 如何调试RESTful服务 这样的问题,其中提到:

不幸的是,同一个浏览器都无法测试HTTP PUT、DELETE 请求,甚至 HTTP POST 请求也只能在某种程度上支持。

我还听说,其他一些来源也提到浏览器仅支持GET和POST,例如: 然而,在 Firefox 中进行一些快速测试后发现发送 PUT 和 DELETE 请求可以按预期工作 -- XMLHttpRequest 完成并且请求以正确的方法显示在服务器日志中。是否存在某些方面的限制,例如跨浏览器兼容性或非明显的限制?

1
你需要担心的不仅是客户端,还有很多服务器端框架只支持GET和POST。 - derby
7
约翰,你不想要REST标记的原因是什么? - John Saunders
11
尽管阅读此文的人很可能正在研究RESTful API。 - djjeck
不是所有的浏览器都支持PUT/DELETE方法,也不是所有的服务器端技术都支持PUT/DELETE。只有HTML 5支持的浏览器才支持PUT/DELETE。 - Jani Devang
7个回答

476

不支持。HTML 5规范中提到:

方法和formmethod内容属性是具有以下关键字和状态的枚举属性:

关键字get映射到GET状态,表示HTTP GET方法。GET方法只应请求和检索数据,不应产生其他效果。

关键字post映射到POST状态,表示HTTP POST方法。POST方法请求服务器接受提交表单的数据进行处理,可能导致添加项目到数据库、创建新的Web页面资源、更新现有页面或所有提到的结果。

关键字dialog映射到对话框状态,表示提交表单旨在关闭表单所在的对话框(如果有),否则不提交。

这些属性的无效值默认为GET状态

即HTML表单仅支持GETPOST作为HTTP请求方法。解决此问题的方法是通过使用一个隐藏的表单字段将其他方法隧道传输到POST中,该字段由服务器读取并相应地调度请求。

然而,XMLHttpRequest的实现(即AJAX调用)在所有主要网络浏览器(IE、Firefox、Safari、Chrome和Opera)中都支持GET、POST、PUT和DELETE。

172
不,我绝对是指HTML(我在谈论HTML表单的功能,尽管这可能在文本中不太清楚 - 我会编辑它)。 - Matthew Murdoch
7
@Pure.Krome(仅仅14个月之后)根据HTML 4.01规范,你无法使用<form method ="put">或<form method="delete">。IE8、Chrome3或FF3.5仅支持GET和POST方法。请注意不要改变原意。 - Jarrett Meyer
24
HTML5添加了这些方法,但又将其删除。目前只允许使用GET和POST方法。http://goo.gl/8EuZk - Adam Lassek
14
HTML5曾经添加过这些功能,然后又将其删除,现在该bug已经重新被打开。有趣的是,我看到一些文档仍然包含它们。如果想要跟踪这个bug,可以访问以下链接:http://www.w3.org/Bugs/Public/show_bug.cgi?id=10671 - Emil Lerch
6
@Pacerier,这并没有解释<article><aside><nav><section>的意思。就像我所说的一样,这是关于语义的。对于HTTP方法也是如此。请阅读规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html另外,如果你需要更实际的原因,请注意PUTDELETE是幂等的,而POST则不是。 - Ajedi32
显示剩余12条评论

90

HTML表单支持GET和POST方法。(HTML5曾经添加PUT/DELETE方法,但后来被删除了。)

XMLHttpRequest 支持所有的HTTP方法,包括CHICKEN,尽管一些方法名称不区分大小写(但HTTP协议是区分大小写的),另外还有一些方法因安全原因而不被支持(例如CONNECT)。

Fetch API 也支持除CONNECT、TRACE和TRACK以外的任何方法,因为这些方法由于安全原因被禁止使用

浏览器正在逐渐接受XMLHttpRequest指定的规则,但正如其他评论所指出的,仍存在一些差异。


5
最新的HTML5草案似乎已经放弃了对PUT和DELETE方法的支持:http://dev.w3.org/html5/spec/Overview.html#attr-fs-method - Stefan Tilkov
3
已经提出了一份草案,旨在让它们回来:http://amundsen.com/examples/put-delete-forms/ - Joost Baaij
27
“CHICKEN?The bird?”我想你可能是指CHECKIN。这是一个有趣的元音交换。 - JayC
58
不,我的意思是鸡肉,你可以随便画。不过我同意元音交换很有趣 :-) - Anne
7
对于那些像我一样对这个“CHICKEN业务”感到困惑的人.... http://w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm - n0nag0n
显示剩余3条评论

44

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 条)——包括 GETPOSTHEADPUTDELETE,正如 RFC 2616 规定的那样。

顺带一提,IE 7–8 只允许以下 HTTP 方法:“GET”、“POST”、“HEAD”、“PUT”、“DELETE”、“MOVE”、“PROPFIND”、“PROPPATCH”、“MKCOL”、“COPY”、“LOCK”、“UNLOCK” 和 “OPTIONS”


7
我希望能看到更多可供阅读的文献资料,我并不是说我不相信你。维基百科上的链接其实很好。谢谢。 - naugtur

24

_method 隐藏字段解决方案

用于Rails,也可以适用于任何框架:


Santilli,嗨,老兄,自从你提供这个解决方案以来已经过了很长时间了。由于我是一个网络开发的初学者,我有一个问题希望你能回答。所以,你说“在服务器上处理_method,并且就好像该方法已经被发送而不是实际的POST一样”,你的意思是如果在视图中放置了带有PUT(或DELETE)的隐藏方法,那么它实际上就意味着PUT(或DELETE)请求,对吗?如果是的话,为什么要在开始时使用POST方法,然后再使用隐藏的PUT或DELETE呢?POST和PUT(或DELETE)之间有什么联系呢? :) - Mirich
1
@Mirich,该表单仅支持POST。因此,我们会发送带有额外数据的POST请求,服务器知道这意味着:哦,我应该将其视为PUT请求处理。 - Ciro Santilli OurBigBook.com
谢谢Ciro的关注和回复,那么我可以这样考虑这种情况吗:POST是一个通用的东西,它包含了实际的POST、PUT、PATCH和DELETE,如果你在开头使用POST而没有隐藏,则意味着实际的POST。但是,如果你使用带有隐藏(PUT或DELETE)的POST,则让服务器知道你想要使用PUT或DELETE,它们作为POST的子级存在。我知道这个比喻有点奇怪,但是这样正确吗? :) - Mirich
1
@Mirich 是的,我认为你已经明白了。 - Ciro Santilli OurBigBook.com
抱歉Ciro,我想知道为什么PUT和DELETE在HTML5中被删除了,因为如果你可以在表单标签的开头使用PUT或DELETE而不使用隐藏,那不是更好吗?请简要明确地解释一下PUT和DELETE被删除的实际原因。提前感谢您的回答 :) - Mirich
@Mirich我不知道HTML5中有什么变化。我不知道其背后的原理,谷歌搜索结果是:https://softwareengineering.stackexchange.com/questions/114156/why-are-there-are-no-put-and-delete-methods-on-html-forms - Ciro Santilli OurBigBook.com

18

我认为这些评论特指浏览器,即点击链接和提交表单,而不是XMLHttpRequestXMLHttpRequest只是使用浏览器作为运行时的JavaScript中自定义的客户端。

更新:为了澄清,我的意思并不是(尽管我写了)编写了XMLHttpRequest,我指的是你编写了使用XMLHttpRequest的代码。浏览器不原生支持XMLHttpRequestXMLHttpRequest来源于JavaScript运行时,可能由浏览器托管,但并非必须如此(请参见Rhino)。这就是为什么人们说浏览器不支持PUTDELETE - 因为实际上是JavaScript在支持它们。


XMLHttpRequest是JavaScript对象模型中的标准对象。 - Jacob Krall
9
@Jacob 确实如此,但不同的浏览器有不同的JavaScript引擎。知道哪些浏览器支持PUT仍然很有帮助。 - senfo
2
“实际上支持它们的是JavaScript”。这并不完全正确。XMLHttpRequest是一种“宿主对象”,意味着它是一种将主机功能暴露给JavaScript代码的对象。它并不是JS本身的一部分。 - Stijn de Witt

11

是的,PUT、DELETE、HEAD等HTTP方法在现代浏览器中都可以使用。

为了符合XMLHttpRequest Level 2标准,浏览器必须支持这些方法。要检查哪些浏览器支持XMLHttpRequest Level 2,我推荐使用CanIUse:

http://caniuse.com/#feat=xhr2

目前只有Opera Mini不支持(截至'15年7月),但是Opera Mini什么都不支持。 :)


8

补充一下- Safari 2及更早版本明确不支持PUT和DELETE。我有印象Safari 3支持,但我不再有它来进行测试了。 Safari 4肯定支持PUT和DELETE。


5
有人可以确认哪个版本的Safari开始支持PUT和DELETE方法吗? - mjs
1
有人能详细说明现在所有的浏览器是否都支持PUT和DELETE方法吗?这已经可用多长时间了。关于“CHICKEN”示例,这是否意味着完全由服务器来解释使用哪种方法,并且JavaScript不限制方法类型...? - Cody

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