大多数Web浏览器中都可以使用PUT,DELETE,HEAD等方法吗?


608

我在这里看到了几个问题,例如如何调试RESTful服务,其中提到:

不幸的是,同一浏览器不允许我测试HTTP PUT,DELETE,并且在某种程度上甚至无法测试HTTP POST。

我还听说其他一些来源的浏览器仅支持GET和POST:

但是,在Firefox中进行的一些快速测试表明,发送PUTDELETE请求可以正常工作- XMLHttpRequest成功完成了请求,并且使用正确的方法将请求显示在服务器日志中。我是否缺少某些方面的信息,例如跨浏览器的兼容性或非显而易见的限制?


1
不仅仅是您需要担心的客户端,许多服务器端框架仅支持GET和POST。
德比

7
John,您不想要REST标签的任何理由?
约翰·桑德斯

11
尽管阅读本文的人可能正在研究RESTful API。
djjeck 2014年


不,所有浏览器都不支持PUT / DELETE方法,也不是所有服务器端技术都不支持PUT / DELETE。仅支持HTML 5的浏览器支持PUT / DELETE。
Jani Devang

Answers:


463

。HTML5规范提到:

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

关键字get,映射到状态GET,指示HTTP GET方法。GET方法应仅请求和检索数据,并且没有其他效果。

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

关键字dialog映射到状态对话框,指示提交表单旨在关闭对话框,在该对话框中,表单将找到自己(如果有),否则将不提交。

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

即HTML表单仅支持GETPOST作为HTTP请求方法。一种解决方法是使用服务器读取的隐藏表单字段并相应地分派请求,从而通过POST隧道传输其他方法。

但是,在所有主要的Web浏览器(IE,Firefox,Safari,Chrome,Opera)中,XMLHttpRequest(即AJAX调用)的实现支持GETPOSTPUTDELETE


170
不,我绝对是说HTML(我正在谈论HTML表单功能,尽管从文字上可能不清楚,我将对其进行编辑)
马修·默多克

6
@Matthew:这是否意味着如果我使用IE6或IE7,并使用以下内容:-<form .. method =“ PUT”> ... </ form>它将不起作用,因为PUT对HTML 4无效?
Pure.Krome

6
@ Pure.Krome(仅14个月后)不,您不能在HTML 4.01规范下执行<form method =“ put”>或<form method =“ delete”>。IE8,Chrome3或FF3.5仅支持GET和POST。
Jarrett Meyer

23
@porneL @Alan HTML5添加了它们,然后将其删除。当前仅允许GET和POST。goo.gl/8EuZk
亚当·

13
@porneL HTML5添加了它们,然后将其删除,现在重新打开了该错误。有趣的是,我已经看到了一些文档,这些文档仍然在那里。如果您想在家中进行操作,请查看以下错误: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch

79

HTML表单支持GET和POST。(HTML5曾一度添加了PUT / DELETE,但已将其删除。)

XMLHttpRequest支持包括CHICKEN在内的所有方法,尽管某些方法名称不区分大小写(方法对于HTTP区分大小写),并且出于安全原因完全不支持某些方法名称(例如CONNECT)。

浏览器正在慢慢收敛于XMLHttpRequest指定的规则,但是正如其他注释所指出的那样,仍然存在一些差异。


5
最新的HTML5草案似乎已放弃对PUT和DELETE的支持:dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan

3
已经提出了将其取回的草案:amundsen.com/examples/put-delete-forms
Joost Baaij 2011年

26
鸡?那只鸟?我想你是说CHECKIN。这是一个有趣的元音交换。
JayC 2012年

52
不,我的意思是说鸡,说明它可以随心所欲。同意元音调换虽然很有趣:-)
安妮(Anne

6
对于那些像我一样迷惑于这种鸡肉
n0nag0n

43

XMLHttpRequest 是JavaScript对象模型中的标准对象。

根据Wikipedia的介绍,它XMLHttpRequest最初作为ActiveX对象出现在Internet Explorer 5中,但此后已成为标准,自1.0,Apple Safari 1.2,Opera 7.60-p1和IE 7.0起就已包含在Mozilla系列的JavaScript中。 。

open()方法在物体上发生的HTTP方法作为参数-和被指定为采取任何有效的HTTP方法(参见链路的项目号5) -包括GETPOSTHEADPUTDELETE,作为由RFC 2616中指定

附带说明,IE 7-8仅允许以下HTTP方法:“ GET”,“ POST”,“ HEAD”,“ PUT”,“ DELETE”,“ MOVE”,“ PROPFIND”,“ PROPPATCH”,“ MKCOL” ,“复制”,“锁定”,“解锁”和“选项”


7
我希望看到一些文档以供进一步阅读,我并不是说我不相信你。维基百科上的链接实际上非常好。谢谢
naugtur

19

_method 隐藏字段的解决方法

在Rails中使用,可以适用于任何框架:

  • 将隐藏_method参数添加到非GET或POST的任何形式:

    <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


Santilli,您好,自您提供此解决方案以来已有很长时间了,而且由于我是Web开发的初学者,所以我有一个问题,希望您能回答。因此,您说“在服务器上处理_method并完全像发送该方法而不是实际的POST一样进行操作”,这意味着如果在视图中放置了带有PUT(或DELETE)的隐藏方法,则实际上意味着PUT (或DELETE)请求对吗?如果是,那么为什么要在开始时使用POST方法,然后使用隐藏的PUT或DELETE。POST和PUT(或DELETE)之间的关系是什么?
Mirich

1
@Mirich表单仅支持POST。因此,我们发送带有额外数据的POST,服务器知道这意味着:啊,我应该将其视为PUT。
西罗Santilli郝海东冠状病六四事件法轮功

谢谢Ciro的关注和答复,所以我可以考虑这样的情况:POST是一种通用的东西,它在其内部保存了实际的POST,PUT,PATCH和DELETE,如果您在开始时使用POST而不进行隐藏,则意味着实际开机自检 但是,如果您将POST与隐藏的(PUT或DELETE)一起使用,则让服务器知道您要使用POST内的PUT或DELETE作为其内部的子代,我知道有点奇怪,但是这样对吗?:)
Mirich

1
@Mirich是的,我想您已经明白了。
西罗Santilli郝海东冠状病六四事件法轮功

抱歉,Ciro只是最后一件事,我想知道为什么从HTML5中删除了PUT和DELETE,因为如果您只可以在form标记的开头使用PUT或DELETE而不使用隐藏就更好了。请您简要简短地说明删除PUT和DELETE的真正原因是什么。预先谢谢您:)
Mirich

15

我认为这些评论专门针对浏览器,即单击链接并提交表单,而不是XMLHttpRequestXMLHttpRequest只是使用JavaScript编写的自定义客户端,使用浏览器作为运行时。

更新:为澄清起见,我并不是说(尽管我确实写过)写的XMLHttpRequest;我的意思是您编写了使用的代码XMLHttpRequest。浏览器本身不支持XMLHttpRequestXMLHttpRequest来自JavaScript运行时,该运行时可能由浏览器托管,尽管不是必须的(请参阅Rhino)。这就是人们说浏览器不支持的原因,PUT并且- DELETE因为实际上是JavaScript 支持了浏览器。


XMLHttpRequest是JavaScript对象模型中的标准对象。
雅各布·克拉尔

9
@Jacob是的,但是不同的浏览器具有不同的JavaScript引擎。知道哪些支持PUT仍然很有帮助。
senfo 2011年

1
it's actually JavaScript that is supporting them。不是真的 XMLHttpRequest是一个“主机对象”,这意味着它是一个将功能从主机公开到Javascript代码的对象。它不是JS本身的一部分。
Stijn de Witt

9

YES,PUT,DELETE,HEAD等HTTP方法在所有现代浏览器中均可用。

为了与XMLHttpRequest级别2兼容,浏览器必须支持这些方法。要检查哪些浏览器支持XMLHttpRequest Level 2,我建议使用CanIUse:

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

只有Opera Mini缺少对atm的支持(juli '15),但是Opera Mini缺少对所有内容的支持。:)


7

补充一点-Safari 2和更早版本肯定不支持PUT和DELETE。我得到的印象是3,但现在没有测试了。Safari 4确实支持PUT和DELETE。


5
谁能确认哪个版本的Safari获得了对PUT和DELETE的支持?
mjs

1
任何人都可以详细说明一下是否所有浏览器现在都支持PUT&DELETE -大致可以使用多长时间了。注意“ CHICKEN”示例,是否意味着它完全取决于服务器来解释所使用的方法,而JavaScript并不限制方法的类型...?
科迪2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.