大多数Web浏览器中是否提供PUT,DELETE,HEAD等方法?

问题描述 投票:588回答:7

我在这里看到了几个问题,比如How to debug RESTful services,它提到:

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

我也听说过浏览器只支持GET和POST,来自其他一些来源:

但是,Firefox中的一些快速测试显示发送PUTDELETE请求按预期工作 - XMLHttpRequest成功完成,并且请求以正确的方法显示在服务器日志中。我是否缺少某些方面,例如跨浏览器兼容性或非明显的限制?

http cross-browser browser ajax
7个回答
456
投票

不,HTML 5 spec提到:

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

关键字get,映射到状态GET,表示HTTP GET方法。 GET方法应该只请求和检索数据,并且不应该有其他影响。

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

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

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

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

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


78
投票

HTML表单支持GET和POST。 (HTML5在某一点上添加了PUT / DELETE,但这些都被删除了。)

XMLHttpRequest支持每个方法,包括CHICKEN,尽管某些方法名称不区分大小写(方法区分大小写),并且出于安全原因(例如CONNECT)根本不支持某些方法名称。

浏览器正在慢慢收敛于XMLHttpRequest指定的规则,但正如另一条评论指出的那样,仍然存在一些差异。


41
投票

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

根据维基百科,XMLHttpRequest首次作为ActiveX对象出现在Internet Explorer 5中,但自那时起已被制作成标准,并且自1.0,Apple Safari 1.2,Opera 7.60-p1和IE以来已被包含在Mozilla家族的JavaScript中使用7.0。

对象上的The open() method将HTTP方法作为参数 - 并指定为采用任何有效的HTTP方法(参见链接的第5项) - 包括GETPOSTHEADPUTDELETE,如specified by RFC 2616

作为旁注IE 7–8 only permit the following HTTP methods: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "LOCK", "UNLOCK", and "OPTIONS"


17
投票

_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


15
投票

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

更新:澄清一下,我并不是说(虽然我写了)你写的是XMLHttpRequest;我的意思是你编写了使用XMLHttpRequest的代码。浏览器本身不支持XMLHttpRequestXMLHttpRequest来自JavaScript运行时,可以由浏览器托管,但不需要(请参阅Rhino)。这就是人们说浏览器不支持PUTDELETE的原因 - 因为它实际上是支持它们的JavaScript。


9
投票

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

要符合XMLHttpRequest Level 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。

© www.soinside.com 2019 - 2024. All rights reserved.