现代浏览器为什么不支持PUT和DELETE表单方法?

40
我刚刚完成了一个最新应用的RESTful API构建。我还建立了一个简单的管理界面脚手架类,可以列举资源并构建简单的表格和表单以进行编辑、创建、删除等操作。
对于更新和删除资源,该类输出一个使用PUT和DELETE方法的表单,非常简单:
<form action="/posts/xxxxxxx" method="DELETE">
<input type="submit" value="Delete" />
</form>

并且

<form action="/posts/xxxxxxx" method="PUT">
<input type="text" name="username" value="nikcub" />
<input type="text" name="fullname" value="Nik Cubrilovic" />
<input type="text" name="email" value="nikcub@email.com" />
<input type="submit" value="Update" />
</form>

非常简单。如果检测到Javascript,则会拦截表单并使用XMLHTTPRequest提交回来。Javascript支持其他HTTP方法,但为什么现代浏览器不支持PUT和DELETE方法?最终只能发送GET。
我希望当应用程序优雅地回退到标准HTML时,仍然使用相同的方法,而不是必须在类中使用隐藏字段和逻辑,或者更糟的是将方法放在URI中并允许GET起作用。
我想不出任何原因,为什么浏览器不支持其他HTTP方法,因为开发人员只是通过黑客GET或使用POST来解决问题。
我搜索了答案,并成功找到它作为XHTML 2.0规范的一部分指定。HTML5规范中没有提到它。
为什么“HTML5兼容”的浏览器不支持它?我在哪里可以发布请求以打开此功能并在浏览器中实现它?

你确定吗,@JoostBaaij?我自己没有尝试过,但MDN上没有提到它。https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form - George Mauer
@JoostBaaij 我刚刚仔细检查了一下。在Chrome30、FF24和IE10中,提交这个表单http://jsbin.com/IWoWiRi/1/,然后在这里http://requestb.in/ol62w4ol?inspect检查请求,`method="PUT"`都显示为`GET`,所以很抱歉,你是错的。 - George Mauer
如果不行,您仍然可以在80端口打开telnet连接,并使用客户端脚本运行命令。 - user2284570
啊,原来只是在HTML元素中。因为PUT / DELETE与GET或POST一样都是HTTP命令。 - user2284570
3
重复的问题 http://programmers.stackexchange.com/q/114156/ - BalusC
显示剩余3条评论
3个回答

25

一些Web框架(例如Ruby on Rails)通过在表单中包含一个隐藏的_method参数,并将其值设置为“实际”的方法来解决这个问题,例如:

<form action="/posts/xxxxx" method="POST">
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="delete">
</form>

该框架会在处理请求之前在服务器端重写请求,以使用_method参数的值作为HTTP方法。

不知道这是否对您有所帮助。


http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work感谢您的阅读。 - Lalit Kumar Maurya
2
Laravel(PHP)也可以做到。 - Praveen
你也可以使用npm包'method-override'在Node.js中完成这个操作 https://github.com/expressjs/method-override - jayasurya_j

10

从技术上讲,这已经在评论中被指出了,但是是的。我认为这可以作为答案。 - George Mauer

8

1
是的,我知道,我想知道为什么在当今REST如此受欢迎的情况下,它没有被实现在“HTML5浏览器”中。 - nikcub
XHTML 2(更确切地说是XForms 1.1)规范包括PUT和DELETE方法。请参见http://www.w3.org/TR/xforms11/#submit-put - Harri
HTML5 目前的状态下不包括那些方法,http://dev.w3.org/html5/spec/Overview.html#attr-fs-method - Harri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接