ChatGPT解决这个技术问题 Extra ChatGPT

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

我在这里看到了几个问题,例如 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 中进行的一些快速测试表明发送 PUTDELETE 请求按预期工作 - XMLHttpRequest 成功完成,并且请求以正确的方法显示在服务器日志中。我是否缺少某些方面,例如跨浏览器兼容性或不明显的限制?

您需要担心的不仅仅是客户端,许多服务器端框架只支持 GET 和 POST。
约翰,你有什么理由不想要 REST 标签?
尽管阅读本文的人可能正在研究 RESTful API。
不,所有浏览器都不支持 PUT/DELETE 方法,也不是所有服务器端技术都不支持 PUT/DELETE。只有支持 HTML 5 的浏览器支持 PUT/DELETE。

m
mikemaccana

没有。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(我说的是 HTML 表单功能,尽管从文本中可能不清楚 - 我会编辑它)
@Matthew:这是否意味着如果我使用 IE6 或 IE7,使用以下内容:-
...
它将不起作用,因为 PUT 对 HTML 4 无效?
@Pure.Krome(仅 14 个月后)不,您不能在 HTML 4.01 规范下执行
或 。 IE8、Chrome3 或 FF3.5 仅支持 GET 和 POST。
@porneL @Alan HTML5 添加它们,然后删除它们。目前只允许 GET 和 POST。 goo.gl/8EuZk
@porneL HTML5 添加了它们,然后删除了它们,现在重新打开了该错误。有趣的是,我看到了一些文档,其中仍然包含它们。如果您想在家继续,这里是错误:w3.org/Bugs/Public/show_bug.cgi?id=10671
3
3 revs, 2 users 80%

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

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

Fetch API 还支持除 CONNECT、TRACE 和 TRACK 之外的任何方法,出于安全原因,它们是 forbidden

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


最新的 HTML5 草稿似乎已放弃 PUT 和 DELETE 支持:dev.w3.org/html5/spec/Overview.html#attr-fs-method
已提议草稿以将其收回:amundsen.com/examples/put-delete-forms
鸡?鸟?我想你的意思是检查。这是一个有趣的元音交换。
不,我的意思是鸡肉,说明它可以是你喜欢的任何东西。同意元音交换很有趣:-)
对于那些和我一样对鸡肉生意感到困惑的人....w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
C
Community

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 项) - 包括 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"


我希望看到一些文档以供进一步阅读,我没有说我不相信你。维基百科上的链接实际上非常好。谢谢
C
Ciro Santilli Путлер Капут 六四事

_method 隐藏字段解决方法

在 Rails 中使用并且可以适应任何框架:

向任何不是 GET 或 POST 的表单添加隐藏的 _method 参数: 这可以通过 HTML 创建辅助方法在框架中自动完成(例如 Rails form_tag )

将实际表单方法修复为 POST (

在服务器上处理 _method 并完全按照发送该方法而不是实际 POST 的方式执行

不可能的理由/历史:https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Santilli,嗨,伙计,很久没有你提供这个解决方案了,由于我是 Web 开发的初学者,我有一个问题希望你能回答。因此,您说“在服务器上处理 _method 并完全按照已发送该方法而不是实际 POST 的方式执行”您的意思是,如果将带有 PUT(或 DELETE)的隐藏方法放在视图中,它实际上意味着 PUT (或删除)请求对吗?如果是,那么为什么要在开始时使用 POST 方法,然后使用隐藏的 PUT 或 DELETE。 POST和PUT(或DELETE)之间有什么联系:)
@Mirich 表单仅支持 POST。所以我们发送带有额外数据的 POST,服务器知道这意味着:啊,我应该把它当作 PUT。
感谢 Ciro 的关注和回复,所以我可以这样考虑这种情况吗:POST 是一个通用的东西,它本身包含实际的 POST、PUT、PATCH 和 DELETE,如果你在开始时使用 POST 而没有隐藏,那么这将意味着实际邮政。但是,如果您将 POST 与隐藏(PUT 或 DELETE)一起使用,那么您会让服务器知道您想使用 POST 内部的 PUT 或 DELETE 作为其内部的子项,我知道一个有点奇怪的类比,但这是正确的吗? :)
@Mirich 是的,我想你已经明白了。
抱歉,Ciro 只是最后一件事,我想知道为什么 PUT 和 DELETE 从 HTML5 中删除,因为如果您可以在表单标记的开头使用 PUT 或 DELETE 而不是使用隐藏,那不是更好。请您能简短而清楚地解释删除 PUT 和 DELETE 的实际原因是什么。先感谢您 :)
H
Hank Gay

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

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


XMLHttpRequest 是 JavaScript 对象模型中的标准对象。
@Jacob 是的,但不同的浏览器有不同的 JavaScript 引擎。知道哪些支持 PUT 仍然很有帮助。
it's actually JavaScript that is supporting them。不是真的。 XMLHttpRequest 是一个“主机对象”,这意味着它是将主机的功能公开给 Javascript 代码的对象。它不是 JS 本身的一部分。
S
Stijn de Witt

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

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

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

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


j
jharlap

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


谁能确认哪个版本的 Safari 获得了对 PUT 和 DELETE 的支持?
任何人都可以详细说明是否所有浏览器现在都支持 PUT & DELETE - 以及大致可用多长时间。注意“鸡”示例,这是否意味着完全由服务器来解释使用哪种方法并且 JavaScript 不限制方法类型......?