我在这里看到了一些问题,比如如何调试RESTful服务,其中提到:
不幸的是,同一浏览器不允许我测试HTTP PUT、DELETE,甚至在某种程度上也不允许我测试HTTP POST。
我也听说过浏览器只支持GET和POST,从其他一些来源,比如:
但是,Firefox中的一些快速测试表明,发送PUT和DELETE请求按预期工作——XMLHttpRequest成功完成,请求以正确的方法显示在服务器日志中。我是否忽略了某些方面,比如跨浏览器兼容性或不明显的限制?
PUT
DELETE
XMLHttpRequest
我相信这些注释是专门针对浏览器的,也就是说,点击链接和提交表单,而不是XMLHttpRequest。XMLHttpRequest只是你用JavaScript编写的自定义客户端,它使用浏览器作为运行时。
更新:澄清一下,我并不是说(尽管我确实写过)你写了XMLHttpRequest;我的意思是您编写了使用XMLHttpRequest的代码。浏览器本身不支持XMLHttpRequest。XMLHttpRequest来自JavaScript运行时,它可能由浏览器托管,尽管它不是必需的(参见犀牛)。这就是为什么人们说浏览器不支持PUT和# eyz5,因为实际上是JavaScript支持它们。
XMLHttpRequest是JavaScript对象模型中的标准对象。
根据维基百科的说法,XMLHttpRequest最初是作为一个ActiveX对象出现在Internet Explorer 5中,但后来成为了一个标准,并在Mozilla家族的1.0、Apple Safari 1.2、Opera 7.60-p1和IE 7.0中被包含在JavaScript中使用。
对象上的open()方法以HTTP方法作为参数-并指定为接受任何有效的HTTP方法(参见链接的第5项)-包括GET, POST, HEAD, PUT和DELETE,如由RFC 2616指定。
open()
GET
POST
HEAD
作为旁注IE 7-8只允许以下HTTP方法:&;get &;, &; post &;, &; head &;, &; put &;, &; delete &;, &; move &;, &; propfind &;, &; proppatch &;, &; mkcol &;, &; copy &;, &; lock &;, &;。
不。HTML 5规范提到:
method和formmethod内容属性是枚举属性 使用以下关键字和状态: 关键字得到,映射到GET状态,表示HTTP GET 方法。GET方法应该只请求和检索数据和 应该没有其他效果了。< / p > 关键字帖子,映射到状态 POST,表示HTTP POST方法。POST方法请求这个 服务器接受要处理的提交表单的数据,这可能 结果在一个项目被添加到数据库,创建一个新的网页 页面资源,更新现有页面,或全部 提到的结果。< / p > 关键字对话框,映射到状态对话框,表明 提交表单的目的是关闭控件所在的对话框 表单发现自己(如果有的话),否则不提交。< / p > 这些属性的默认无效值是GET状态
关键字得到,映射到GET状态,表示HTTP GET 方法。GET方法应该只请求和检索数据和 应该没有其他效果了。< / p >
关键字帖子,映射到状态 POST,表示HTTP POST方法。POST方法请求这个 服务器接受要处理的提交表单的数据,这可能 结果在一个项目被添加到数据库,创建一个新的网页 页面资源,更新现有页面,或全部 提到的结果。< / p >
关键字对话框,映射到状态对话框,表明 提交表单的目的是关闭控件所在的对话框 表单发现自己(如果有的话),否则不提交。< / p >
这些属性的默认无效值是GET状态
也就是说,HTML表单只支持得到和帖子作为HTTP请求方法。一种解决方法是使用隐藏的表单字段(由服务器读取并相应地分发请求)通过POST隧道其他方法。
然而,得到, 帖子, 把和删除 是在所有主要的web浏览器(IE, Firefox, Safari, Chrome, Opera)中都支持XMLHttpRequest的实现(即AJAX调用)。
HTML表单支持GET和POST。(HTML5一度增加了PUT/DELETE功能,但后来这些功能被删除了。)
XMLHttpRequest支持包括CHICKEN在内的所有方法,尽管一些方法名是不区分大小写的(每个HTTP方法都是区分大小写的),而出于安全原因,一些方法名根本不支持(例如CONNECT)。
获取API还支持除CONNECT、TRACE和TRACK之外的任何方法,出于安全原因,这些方法都是被禁止的。
浏览器正在慢慢地向XMLHttpRequest所指定的规则靠拢,但正如另一个评论所指出的那样,仍然存在一些差异。
只是补充一点——Safari 2和更早的版本肯定不支持PUT和DELETE。我的印象是3,但我再也没有它来测试了。Safari 4确实支持PUT和DELETE。
_method隐藏字段的解决方法
_method
在Rails中使用,可以适应任何框架:
添加一个隐藏的_method参数到任何不是GET或POST的表单:
<input type="hidden" name="_method" value="DELETE">
这可以在框架中通过HTML创建助手方法(例如Rails form_tag)
form_tag
修复实际的表单方法为POST (<form method="post")
<form method="post"
在服务器上处理_method,并完全像发送该方法一样,而不是实际的POST
为什么它是不可能的理由/历史:https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms
是的, PUT, DELETE, HEAD等HTTP方法在所有现代浏览器中都可用。
为了兼容XMLHttpRequest级别2浏览器,必须支持这些方法。要检查哪些浏览器支持XMLHttpRequest Level 2,我建议CanIUse:
< a href = " http://caniuse.com/壮举= xhr2 " > = http://caniuse.com/壮举xhr2 < / >
只有Opera Mini缺乏支持atm (juli '15),但Opera Mini缺乏对一切的支持。:)