最近我看到很多框架都决定在表单提交中“伪造”PUT和DELETE请求,比如Ruby on Rails。它们似乎正在等待浏览器跟进,但是它们等的结果是否会令人失望?
这个功能是否已经在任何地方被实现了呢?
浏览器 支持 PUT
和 DELETE
方法,但是它们的使用不符合 HTML 规范。
例如,浏览器可以通过 Javascript(AJAX)发起 PUT
请求,但不能通过 HTML <form>
提交表单。
这是因为 HTML 4.01 和 W3C HTML 5.0 规范中规定,form
元素只能允许 GET 和 POST 方法。
在 HTML 5 开发过程中对此进行了广泛的讨论,一度将其他方法添加到了 HTML 5 中,但最终又被移除了。之所以从 HTML 5 规范中删除了这些额外的方法,是因为 HTML 4 级别的浏览器无法支持它们(它们当时还不是 HTML 的一部分),也没有其他方式使其能够支持,除非使用 JavaScript shim;因此,最好使用 AJAX 来实现。
使用 method="PUT"
或 method="DELETE"
的表单将会被所有当前浏览器回退到默认方法 GET,这会破坏网页应用程序尝试使用 HTML 表单中适当的方法执行预期操作的尝试,并导致更糟糕的结果——使用 GET
方法来删除东西!(搜索引擎爬虫你好,哎呀,我的数据库没了)。
将 HTML <form>
元素的默认方法更改为 POST
可以解决这个问题(我认为自从 Mosaic* 在 1993 年首次推出表单后,应该一直将默认值设为 POST),但要更改默认值需要至少十年时间才能在已安装的基础上渗透。所以可以用两个词来描述:‘因为遗留问题’。 :-(
_method
参数,在HTML中包含<input type=hidden name=_method value=DELETE>
; 将表单方法切换为POST
(由于请求是不安全的); 然后在服务器端添加对_method
的识别,这应该会做出必要的更改并将其转发,就好像它是一个真正的DELETE请求一样。204 No Content
。您应该发送带有链接的超媒体响应,以便用户可以推进其浏览器状态。<img src=…>
标记的复合错误——它应该是<image source=…>fallback</image>
。
PUT
和DELETE
语义?您已经可以以编程方式生成 HTTP 的PUT
和DELETE
操作。只是我无法想象如何将这些操作暴露给浏览器中的用户(当您将文件拖入浏览器时会发生什么?会执行PUT
操作吗?) - Gian