PUT和DELETE应该在表单中使用吗?

103

假设我的Web应用程序在服务器端完全支持PUT和DELETE,那么我应该利用它们吗?

基本上我的问题是有多少浏览器支持这个:

<form method="PUT">
或者
<form method="DELETE">

除符合 REST 规范外,使用这两种 HTTP 方法还有其他好处吗?(假设这两种方法的替代方式是常用的 POST)

6个回答

108

你的问题涉及两个紧密相关但彼此分离的标准,HTTP和HTML。PUT和DELETE方法是HTTP的一部分。在HTTP中,它们在RESTful接口以及其他构建在HTTP之上的服务(如Webdav)中具有明显的用途。

HTML在版本4之前仅为表单定义了POST和GET的用法。目前看来,HTML5可能会支持更多的方法。[注意,当前的w3草案中没有包括支持]

任何当前的浏览器支持(我并不直接知道)都非常有限,只能作为尝试最前沿技术的实验使用。


22
目前的HTML5草案不支持在表单中使用“PUT”或“DELETE”。相关部分目前处于“最后评论期”,因此它们可能会被实现,但不幸的是看起来似乎不会。我认为曾经有过这样的规定,但后来被删除了。 - Andrew Marshall
1
关于浏览器支持,Mozilla 对 FF4 的兴趣点有一个相关的问题单,其中表明他们曾经支持它,但现在已经移除了 - https://bugzilla.mozilla.org/show_bug.cgi?id=600813。 - leebriggs
@andrew 的确,它是几年草案的一部分,但去年末被删除了。我的意图不是要暗示它将成为标准的一部分,只是可能会成为其中的一部分。 - leebriggs
11
我对这些方法被删除感到非常失望,因为它们很有意义。有人有关于这个决定背后原因的链接吗? - Tristian
5
好的,我会尽力进行翻译。以下是需要翻译的内容:@Triztian https://www.w3.org/Bugs/Public/show_bug.cgi?id=10671 and for the full story: http://programmers.stackexchange.com/a/211790/26123 - Paolo

32

GET、POST、PUT和DELETE(还有其他方法)是HTTP标准的一部分,但在HTML表单中您目前只能使用GET和POST。

正如安德鲁所提到的,您可以在AJAX请求中使用PUT和DELETE,但这仅适用于某些浏览器(请参见http://api.jquery.com/jQuery.ajax/)。


22

不,GETPOSTmethod属性的唯一有效HTTP方法值。有关更多信息,请参见HTML规范

虽然我认为你可以在AJAX请求中使用它们。


链接已损坏。 - code_dredd
4
@code_dredd,有人使用DELETE而不是GET打开了它。 - toddmo
@toddmo 不确定你是在暗示我这样做了,但是从浏览器点击链接并不会导致那种情况发生。 - code_dredd

15

0
其他人已经解释得很好了,但你可以访问Github上的answer以获取更多解释。
可能不会,因为这会对<form>的处理模型产生相当大的复杂性。特别是,<form>目前的同源策略例外并不允许使用这些方法。要么我们必须禁止在跨域请求中使用它们,要么以某种方式要求CORS。这两个限制对于导航来说都是首次出现的,而且风险相当大。

0

使用<form />发送DELETE请求并不是真正可行的,但您可以将其发送到一个API端点并将用户重定向到另一个页面。这将模拟所需的行为。以下是使用jQuery的代码。

$(".control-action").on("click", () => {
  alert("Click");

  $.ajax({
    // call a DELETE endpoint of API
    url: "/api/items/5",
    method: "DELETE",
    headers: {
      "X-Api-Key": "363463822036d927c733d5607af109e2"
    },
    success : function () {
      // redirect to another page
      // window.location.href = "/items";
    }
  });
});
.link {
  text-decoration: underline;
  cursor: pointer;
  color: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>

<span class="link control-action">Call action</span>


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