626

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

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

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

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

4

7 回答 7

472

不,HTML 5 规范提到:

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

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

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

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

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

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

然而,所有主要网络浏览器(IE、Firefox、Safari、Chrome、Opera)中的 XMLHttpRequest(即 AJAX 调用)的实现支持GETPOSTPUTDELETE 。

于 2008-10-03T12:02:06.047 回答
85

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

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

Fetch API还支持除 CONNECT、TRACE 和 TRACK 之外的任何方法,出于安全原因,这些方法是被禁止的。

浏览器正在慢慢融合 XMLHttpRequest 指定的规则,但正如其他评论指出的那样,仍然存在一些差异。

于 2008-10-05T13:40:40.760 回答
44

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

根据 Wikipedia 的说法,XMLHttpRequest最初作为 ActiveX 对象出现在 Internet Explorer 5 中,但此后已成为标准,并在 Mozilla 家族的 JavaScript 1.0、Apple Safari 1.2、Opera 7.60-p1 和 IE 7.0 中使用.

对象上的open()方法将 HTTP 方法作为参数 - 并指定为采用任何有效的 HTTP 方法(请参阅链接的第 5 项) - 包括GETPOST、和HEAD,如RFC 2616所指定。PUTDELETE

作为旁注,IE 7-8 只允许以下 HTTP 方法:“GET”、“POST”、“HEAD”、“PUT”、“DELETE”、“MOVE”、“PROPFIND”、“PROPPATCH”、“MKCOL” 、“复制”、“锁定”、“解锁”和“选项”

于 2008-10-03T09:59:29.517 回答
23

_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

于 2014-11-12T21:49:46.223 回答
17

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

更新:澄清一下,我并不是说(虽然我确实写过)写的XMLHttpRequest;我的意思是您编写的代码使用XMLHttpRequest. 浏览器本身不支持XMLHttpRequest. XMLHttpRequest来自 JavaScript 运行时,它可能由浏览器托管,尽管它不是必需的(请参阅Rhino)。这就是为什么人们说浏览器不支持PUT并且——DELETE因为实际上是 JavaScript 支持它们。

于 2008-10-03T09:49:34.153 回答
10

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

要与XMLHttpRequest Level 2兼容,浏览器必须支持这些方法。要检查哪些浏览器支持 XMLHttpRequest Level 2,我推荐 CanIUse:

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

只有 Opera Mini 缺乏对 atm 的支持(juli '15),但 Opera Mini 缺乏对一切的支持。:)

于 2015-07-21T20:52:42.173 回答
8

只是添加 - Safari 2 和更早版本绝对不支持 PUT 和 DELETE。我得到了印象 3,但我没有它来测试了。Safari 4 确实支持 PUT 和 DELETE。

于 2009-07-31T14:39:13.547 回答