为什么浏览器不支持PUT和DELETE请求,何时支持?

时间:2013-05-29 05:12:37

标签: rest put

我最近看到许多框架决定“伪造”PUT和DELETE请求。就像Ruby on Rails一样。他们似乎在等待浏览器赶上来。他们在等待是徒劳的吗?

这甚至可以在任何地方实施吗?

1 个答案:

答案 0 :(得分:60)

浏览器支持PUTDELETE,但 HTML 则不支持。

例如,浏览器将通过Javascript(AJAX)发起PUT请求,但不会通过HTML <form>提交。

这是因为HTML 4.01和最终的W3C HTML 5.0规范都说他们的form元素应该允许的唯一HTTP方法是GET和POST。

在HTML 5的开发过程中对此进行了大量讨论,并且有一次他们已经添加到HTML 5中,只是要再次删除。从HTML 5规范中删除其他方法的原因是因为HTML 4级浏览器永远不会支持它们(在制作它们时不是HTML的一部分);没有JavaScript垫片就没有办法允许他们这样做;因此,您也可以使用AJAX。

尝试使用method="PUT"method="DELETE"的表单的网页会回退到所有当前浏览器的默认方法GET 。这打破了Web应用程序尝试在HTML表单中使用适当的方法进行预期操作,并最终导致更糟糕的结果 - GET被用于删除内容! (你好爬虫。哦,哎呀!有我的数据库)

将HTML <form>元素的默认方法更改为POST会有所帮助(默认情况下IMO默认应该始终为POST,自从Moasic *于1993年首次推出以来),但要改变默认情况下至少需要十年时间才能通过已安装的基础进行渗透。所以用两个词来说:'因为遗产'。 : - (

为了支持当前的浏览器,作者必须使用覆盖伪造它。我建议作者使用广为人知的 ab _method参数,在其HTML中包含<input type=hidden name=_method value=DELETE>;将表单方法切换为POST(因为请求不安全);然后在服务器端添加_method的识别,然后应该做任何必要的变更请求并将其转发,就像它是真正的DELETE请求一样。

另请注意,由于Web浏览器是最终的HATEOAS客户端,因此需要将新状态传输给它们以进行DELETE请求。对于此类请求,现有API通常会返回204 No Content。您应该发回带有链接的超媒体响应,以便用户可以改进其浏览器状态。

另见这些相似/相同问题的答案:

<小时/> * Marc Andreessen创建的Mosiac也引入了<img src=…>标签的复合错误 - 应该是<image source=…>fallback</image>