我在这里看到了几个问题,例如How to debug RESTful services,其中提到:
不幸的是,同样的浏览器不允许我测试HTTP PUT,DELETE,甚至在某种程度上测试HTTP POST。
我也听说浏览器只支持GET和POST,来自其他一些来源,如:
然而,Firefox中的一些快速测试表明发送PUT
和DELETE
请求按预期工作 - XMLHttpRequest
成功完成,请求显示在服务器日志中正确的方法。我是否缺少某些方面,例如跨浏览器兼容性或非显而易见的限制?
答案 0 :(得分:453)
没有。 HTML 5 spec提及:
方法和formmethod内容属性是枚举属性 使用以下关键字和状态:
关键字获取,映射到状态GET,表示HTTP GET 方法。 GET方法应该只请求和检索数据 应该没有其他影响。
关键字发布,映射到州 POST,表示HTTP POST方法。 POST方法请求 服务器接受提交的表单要处理的数据,这可能是 导致项目被添加到数据库中,创建新的Web 页面资源,现有页面的更新或全部 提到的结果。
关键字对话框,映射到状态对话框,表示 提交表单旨在关闭其中的对话框 表单发现自己,如果有的话,否则不提交。
这些属性的无效值默认值为GET状态
即。 HTML表单仅支持 GET 和 POST 作为HTTP请求方法。解决方法是使用隐藏的表单字段通过POST隧道传输其他方法,该字段由服务器读取并相应地调度请求。
然而, GET , POST , PUT 和 DELETE 受支持在所有主要的Web浏览器(IE,Firefox,Safari,Chrome,Opera)中实现XMLHttpRequest(即AJAX调用)。
答案 1 :(得分:76)
HTML表单支持GET和POST。 (HTML5在某一点上添加了PUT / DELETE,但这些都被删除了。)
XMLHttpRequest支持所有方法,包括CHICKEN,尽管某些方法名称不区分大小写(方法对每个HTTP区分大小写),并且出于安全原因(例如CONNECT),根本不支持某些方法名称。
浏览器正在慢慢收敛于XMLHttpRequest指定的规则,但正如另一条评论指出的那样,仍存在一些差异。
答案 2 :(得分:41)
XMLHttpRequest
是JavaScript对象模型中的标准对象。
根据维基百科的说法,XMLHttpRequest
首次出现在Internet Explorer 5中作为ActiveX对象,但后来被制作成标准,并且自1.0,Apple Safari 1.2以来一直被用于Mozilla家族的JavaScript中, Opera 7.60-p1和IE 7.0。
The open()
method将HTTP方法作为参数 - 并指定为采用任何有效的HTTP方法(请参阅链接的第5项) - 包括GET
,{{1} },POST
,HEAD
和PUT
,为specified by RFC 2616。
答案 3 :(得分:15)
我认为这些评论专门针对浏览器,即点击链接和提交表单,而不是XMLHttpRequest
。 XMLHttpRequest
只是您在JavaScript中编写的自定义客户端,它将浏览器用作运行时。
更新:澄清一下,我并不是说(虽然我写了)你写了XMLHttpRequest
;我的意思是你编写了使用XMLHttpRequest
的代码。浏览器本身不支持XMLHttpRequest
。 XMLHttpRequest
来自JavaScript运行时,可以由浏览器托管,但不一定要求(请参阅Rhino)。这就是人们说浏览器不支持PUT
和DELETE
的原因 - 因为它实际上是支持它们的JavaScript。
答案 4 :(得分:15)
_method
隐藏字段解决方法
在Rails中使用,可以适应任何框架:
将隐藏的_method
参数添加到任何非GET或POST的表单中:
<input type="hidden" name="_method" value="DELETE">
这可以通过HTML创建帮助器方法在框架中自动完成(例如Rails form_tag
)
将实际的表单方法修复为POST(<form method="post"
)
处理服务器上的_method
,就像发送该方法而不是实际的POST一样
答案 5 :(得分:8)
是,PUT,DELETE,HEAD等所有现代浏览器都提供HTTP方法。
要符合XMLHttpRequest Level 2个浏览器,必须支持这些方法。要检查哪些浏览器支持XMLHttpRequest Level 2,我建议使用CanIUse:
只有Opera Mini缺乏支持atm(juli&#15; 15),但Opera Mini缺乏对所有内容的支持。 :)
答案 6 :(得分:7)
只是添加 - Safari 2及更早版本肯定不支持PUT和DELETE。我得到的印象是3,但我不再需要它来测试了。 Safari 4肯定支持PUT和DELETE。