我在这里看到了几个问题,例如 How to debug RESTful services,其中提到:
不幸的是,同一个浏览器不允许我测试 HTTP PUT、DELETE,在某种程度上甚至是 HTTP POST。
我还听说浏览器仅支持 GET 和 POST,来自其他一些来源,例如:
http://www.packetizer.com/ws/rest.html
http://www.mail-archive.com/jmeter-user@jakarta.apache.org/msg13518.html
http://www.xml.com/cs/user/view/cs_msg/1098
但是,在 Firefox 中进行的一些快速测试表明发送 PUT
和 DELETE
请求按预期工作 - XMLHttpRequest
成功完成,并且请求以正确的方法显示在服务器日志中。我是否缺少某些方面,例如跨浏览器兼容性或不明显的限制?
没有。HTML 5 spec 提到:
method 和 formmethod 内容属性为枚举属性,包含以下关键字和状态: 关键字 get,映射到状态 GET,表示 HTTP GET 方法。 GET 方法应该只请求和检索数据,应该没有其他效果。关键字 post,映射到状态 POST,表示 HTTP POST 方法。 POST 方法请求服务器接受要处理的提交表单的数据,这可能导致将项目添加到数据库、创建新的网页资源、更新现有页面或所有提到的结果.关键字dialog,映射到状态对话框,表示提交表单的目的是关闭表单所在的对话框(如果有的话),否则不提交。这些属性的无效值默认值是 GET 状态
即 HTML 表单仅支持 GET 和 POST 作为 HTTP 请求方法。解决此问题的方法是使用隐藏的表单字段通过 POST 通过 POST 隧道传输其他方法,该字段由服务器读取并相应地分派请求。
但是,所有主要的网络浏览器(IE、Firefox、Safari、Chrome、Opera)中的 XMLHttpRequest(即 AJAX 调用)的实现都支持 GET、POST、PUT 和 DELETE。
HTML forms 支持 GET 和 POST。 (HTML5 曾一度添加了 PUT/DELETE,但这些都被删除了。)
XMLHttpRequest 支持所有方法,包括 CHICKEN,尽管某些方法名称不区分大小写(每个 HTTP 方法都区分大小写),并且出于安全原因(例如 CONNECT),根本不支持某些方法名称。
Fetch API 还支持除 CONNECT、TRACE 和 TRACK 之外的任何方法,出于安全原因,它们是 forbidden。
浏览器正在慢慢融合 XMLHttpRequest 指定的规则,但正如其他评论指出的那样,仍然存在一些差异。
XMLHttpRequest
是 JavaScript 对象模型中的标准对象。
根据 Wikipedia 的说法,XMLHttpRequest
最初作为 ActiveX 对象出现在 Internet Explorer 5 中,但后来已成为标准,并从 Mozilla 家族的 JavaScript 1.0、Apple Safari 1.2、Opera 7.60-p1、和 IE 7.0。
对象上的 The open()
method 将 HTTP 方法作为参数 - 并指定为采用任何有效的 HTTP 方法(请参阅链接的第 5 项) - 包括 GET
、POST
、HEAD
、PUT
和 DELETE
,如 specified by RFC 2616。
_method
隐藏字段解决方法
在 Rails 中使用并且可以适应任何框架:
向任何不是 GET 或 POST 的表单添加隐藏的 _method 参数: 这可以通过 HTML 创建辅助方法在框架中自动完成(例如 Rails form_tag )
将实际表单方法修复为 POST (
我相信这些评论专门针对浏览器,即点击链接和提交表单,而不是XMLHttpRequest
。 XMLHttpRequest
只是 您 用 JavaScript 编写的自定义客户端,它使用浏览器作为运行时。
更新:为了澄清,我并不是说(尽管我确实写过)你写了 XMLHttpRequest
;我的意思是您编写了使用 XMLHttpRequest
的代码。浏览器本身不支持 XMLHttpRequest
。 XMLHttpRequest
来自 JavaScript 运行时,它可以由浏览器托管,但不是必须的(请参阅 Rhino)。这就是人们说浏览器不支持 PUT
和 DELETE
的原因——因为实际上是 JavaScript 支持它们。
it's actually JavaScript that is supporting them
。不是真的。 XMLHttpRequest
是一个“主机对象”,这意味着它是将主机的功能公开给 Javascript 代码的对象。它不是 JS 本身的一部分。
是的,PUT、DELETE、HEAD 等 HTTP 方法在所有现代浏览器中都可用。
要与 XMLHttpRequest Level 2 浏览器兼容,必须支持这些方法。要检查哪些浏览器支持 XMLHttpRequest Level 2,我推荐 CanIUse:
只有 Opera Mini 缺乏对 atm 的支持(juli '15),但 Opera Mini 缺乏对一切的支持。 :)
只是添加 - Safari 2 和更早版本绝对不支持 PUT 和 DELETE。我得到了印象 3,但我没有它来测试了。 Safari 4 确实支持 PUT 和 DELETE。
不定期副业成功案例分享