【问题标题】:Why don't browsers support PUT and DELETE requests and when will they?为什么浏览器不支持 PUT 和 DELETE 请求,什么时候支持?
【发布时间】:2013-05-24 05:53:03
【问题描述】:

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

这甚至计划在任何地方实施吗?

【问题讨论】:

  • 哪些浏览器级别的操作需要PUTDELETE 语义?您已经可以以编程方式生成 HTTP PUTDELETE 操作。只是我无法想象如何在浏览器中将这些公开给用户(它会做什么?PUT 当您将文件拖到浏览器中时?)
  • 它们在 HTML5 和 Ajax 请求中受支持。
  • @N1xx1 所以在 html5 中我可以做到
    ?甜的。我会调查一下。
  • @N1xx1 似乎您不能在表单元素中使用 put/delete。 w3.org/TR/2010/WD-html5-diff-20101019/#changes-2010-06-24

标签: rest put


【解决方案1】:

浏览器确实支持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 shim,就无法让他们这样做;因此,您不妨使用 AJAX。

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

将 HTML <form> 元素的默认方法更改为 POST 会有所帮助(自 Moasic* 于 1993 年首次推出表单以来,IMO 的默认值应始终为 POST),但更改默认值至少需要十年来渗透到已安装的基础上。所以用两个词来说:“因为遗产”。 :-(

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

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

另请参阅这些类似/相同问题的答案:


* Marc Andreessen 创建的 Mosaic 还引入了<img src=…> 标签的复合错误——它应该是<image source=…>fallback</image>

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 2020-08-31
    • 2019-02-12
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多