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

Joh*_*kin 596 browser ajax http cross-browser

我在这里看到了几个问题,例如如何调试RESTful服务,其中提到:

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

我也听说过浏览器只支持GET和POST,来自其他一些来源:

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

Mat*_*och 457

HTML表单(最高为HTML版本4和XHTML 1)仅支持GETPOST作为HTTP请求方法.解决方法是使用隐藏的表单字段通过POST隧道其他方法,该字段由服务器读取并相应地分派请求.

然而,GET,POST,PUTDELETE 通过了XMLHttpRequest中的所有主流浏览器(IE,火狐,Safari,Chrome浏览器,Opera)的实现方式(即AJAX调用)的支持.

  • 不,我绝对是指HTML(我说的是HTML表单功能,虽然从文本中可能不太清楚 - 我会编辑它) (170认同)
  • @porneL @Alan HTML5添加了它们,然后删除它们.目前只允许GET和POST.http://goo.gl/8EuZk (23认同)
  • @porneL HTML5添加了它们,然后删除它们,现在重新打开了bug.有趣的是,我已经看到一些文档仍然存在于那里.如果你想在家里跟进,这就是错误:http://www.w3.org/Bugs/Public/show_bug.cgi?id = 10671 (13认同)
  • @Matthew:这是否意味着如果我使用IE6或IE7,请使用以下内容: - <form .. method ="PUT"> ... </ form>它不起作用,因为PUT对HTML 4无效? (6认同)
  • @ Pure.Krome(仅14个月后)不,你不能在HTML 4.01规范下做<form method ="put">或<form method ="delete">.IE8,Chrome3或FF3.5仅支持GET和POST. (6认同)
  • @Pacerier虽然没有解释`<article>`,`<aside>`,`<nav>`和`<section>`.就像我说的那样,它是关于语义的.HTTP方法也是如此.阅读规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html另外,如果你需要一个更实际的原因,请注意`PUT`和`DELETE`是幂等的.`POST`不是. (6认同)
  • @Pacerier这有点像在HTML中使用`<table>`进行布局,或者使用`<font>`标签进行样式化.你_can_这样做,但它在语义和/或结构上是不正确的.如今,许多Web框架在其表单中使用了一个特殊的"方法覆盖"字段,这允许它们发送由服务器解释为"PUT"或"DELETE"的请求.这是一个只能通过允许表单使用这些方法来实现修复的黑客. (5认同)
  • "HTML(最高版本4和XHTML 1)"< - 我想你的意思是说HTTP.请记住:HTML是一种文件格式(例如.exe,.doc或.psd),HTTP是用于信息交换的协议(例如HTML网页,图像或单词.doc文件). (3认同)
  • @Pacerier实际上,对于正确实现所有HTTP方法的服务器,可以使用OPTIONS方法"爬行"PUT和DELETE请求(或至少确定哪些页面支持它们).另外,我并不是说POST不能是幂等的,只是说HTTP客户端不能像PUTS和DELETE那样假设它.(因此,"确认重新提交"会提示您经常在浏览器中看到). (3认同)
  • @porneL是的,HTML5允许这些方法的形式,但遗憾的是没有浏览器似乎支持它们(两年后). (2认同)
  • @Pacerier如何在没有PUT或PATCH的情况下更新资源?如何在没有DELETE的情况下删除一个?POST仅用于创建新资源. (2认同)

Ann*_*nne 78

HTML表单支持GET和POST.(HTML5在某一点上添加了PUT/DELETE,但这些都被删除了.)

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

浏览器正在慢慢收敛于XMLHttpRequest指定的规则,但正如另一条评论指出的那样,仍然存在一些差异.

  • 不,我的意思是鸡,说明它可以是你喜欢的任何东西.同意关于元音交换有趣但是:-) (51认同)
  • 鸡?那只鸟?我想你的意思是CHECKIN.这是一个有趣的元音交换. (26认同)
  • 对于那些和我这个CHICKEN业务一样困惑的人...... http://w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm (6认同)
  • 最新的HTML5草案似乎已经放弃了PUT和DELETE支持:http://dev.w3.org/html5/spec/Overview.html#attr-fs-method (5认同)
  • 已提议草案将其取回:http://amundsen.com/examples/put-delete-forms/ (3认同)
  • 注意:IE6/7/8只允许"标准"HTTP方法,它们不允许使用CHICKEN方法.你会得到一个"非法论证"的例外. (3认同)

Vih*_*ung 41

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

根据维基百科,XMLHttpRequest首次出现在Internet Explorer 5中作为ActiveX对象,但从那时起已被制作成标准,并且自1.0,Apple Safari 1.2,Opera 7.60-p1和IE 7.0以来已被包含在Mozilla家族的JavaScript中使用.

open()方法在对象上采用作为参数的HTTP方法-和被指定为采取任何有效的HTTP方法(参见链路的项目号5) -包括GET,POST,HEAD,PUTDELETE,作为由RFC 2616中指定.

作为附注,IE 7-8仅允许以下HTTP方法:"GET","POST","HEAD","PUT","DELETE","MOVE","PROPFIND","PROPPATCH","MKCOL" ,"复制","锁定","解锁"和"选项".

  • 我希望看到一些文档供进一步阅读,我不是说我不相信你.维基百科上的链接实际上非常好.谢谢 (7认同)

Cir*_*四事件 17

_method 隐藏的字段解决方法

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

  • 将隐藏_method参数添加到任何非GET或POST的表单:

    <input type="hidden" name="_method" value="DELETE">
    
    Run Code Online (Sandbox Code Playgroud)

    这可以通过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


Han*_*Gay 15

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

更新:澄清一下,我并不是说(尽管我写了)写的XMLHttpRequest; 我的意思是你编写了使用的代码XMLHttpRequest.浏览器本身不支持XMLHttpRequest.XMLHttpRequest来自JavaScript运行时,可以由浏览器托管,但不需要(请参阅Rhino).这就是为什么人们说的浏览器不支持PUTDELETE-因为它实际上是支持他们的JavaScript.

  • @Jacob True,但不同的浏览器有不同的JavaScript引擎.知道哪些支持PUT仍然有用. (9认同)
  • “实际上是 JavaScript 支持它们”。事实并非如此。“XMLHttpRequest”是一个“主机对象”,这意味着它是一个将主机功能公开给 Javascript 代码的对象。它不是 JS 本身的一部分。 (2认同)

Sti*_*itt 9

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

要符合XMLHttpRequest Level 2,浏览器必须支持这些方法.要检查哪些浏览器支持XMLHttpRequest Level 2,我建议使用CanIUse:

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

只有Opera Mini缺乏支持atm(juli '15),但Opera Mini缺乏对所有内容的支持.:)


小智 7

只是添加 - Safari 2及更早版本肯定不支持PUT和DELETE.我得到的印象是3,但我不再需要它来测试了.Safari 4肯定支持PUT和DELETE.

  • 任何人都可以确认哪个版本的Safari获得了对PUT和DELETE的支持? (5认同)