PUT / DELETE是否是REST自动的幂等功能?

时间:2011-08-10 19:42:46

标签: http rest

我正在学习REST和PUT / DELETE,我已经读过这两个(和GET一起)是幂等的,意味着多个请求使服务器进入相同的状态。

重复的PUT / DELETE请求是否会离开Web浏览器(使用XMLHttpRequest时)?换句话说,服务器是否会为每个PUT请求更新相同的数据库记录,还是会自动忽略重复的请求?

如果是,那么使用PUT或DELETE与使用POST有何不同?

我读了一篇文章,建议RESTful Web服务是前进的方向。 HTML5表单不支持PUT / DELETE方法有什么特别的原因吗?

3 个答案:

答案 0 :(得分:42)

REST只是数据访问和操作的设计结构。服务器必须如何对数据请求做出反应没有固定的规则。

话虽如此,PUTDELETE的REST请求通常如下:

DELETE /item/10293

PUT /item/23848
foo=bar
fizz=buzz
herp=derp

给出的请求与特定ID相关联。因此,告诉服务器删除相同的ID 15次将最终得到与调用一次相同的结果,除非进行某种重新编号。

使用PUT请求,告诉服务器将特定项更新为特定值也会产生相同的结果。

命令是非幂等的情况通常会涉及某种相对值:

DELETE /item/last

调用15次可能会删除15个项目,而不是相同的最后一项。正确使用HTTP的替代方案可能如下所示:

POST /item/last?action=delete

同样,REST不是官方规范,它只是具有一些共同特征的结构。有很多方法可以实现RESTful结构。


支持PUT&的HTML5表单DELETE,浏览器开始支持不同的方法,而不是规范本身。如果所有浏览器都开始实现表单提交的不同方法,我相信它们会被添加到规范中。

随着网络的发展,一个好的RESTful实现也可能会包含某种形式的AJAX ,所以对我来说似乎没什么必要。

答案 1 :(得分:6)

  

重复的PUT / DELETE请求是否会离开Web浏览器(使用XMLHttpRequest时)?

是的,当然。幂等性只是一种惯例,并没有强制执行。如果您提出请求,重复或不重复,它将会运行。

  

换句话说,服务器是否会为每个PUT请求更新相同的数据库记录,还是会自动忽略重复的请求?

如果它符合REST,它应该两次更新相同的数据库记录,例如两次运行UPDATE user SET name = 'John'。但是不能保证它会做什么或不做什么,这取决于它是如何实现的。

  

如果是,那么使用PUT或DELETE与使用POST有何不同?

这只是一个惯例。 PUT和DELETE请求可能会或可能不会与站点代码中的POST处理不同。

  

我读了一篇文章,建议RESTful Web服务是前进的方向。 HTML5表单不支持PUT / DELETE方法有什么特别的原因吗?

说实话,我不太确定。您可以使用名为<input>或类似的隐藏_method字段并将其设置为DELETE或PUT,然后处理该服务器端来解决此问题。

答案 2 :(得分:2)

PUT操作是幂等的但不安全的操作。如果重复PUT操作成功,则不会插入重复记录。在验证条件标头(如If-unmodified-since和/或if-match)后,如果出现NetworkFailure错误,请重复PUT操作。如果是4XX或5XX错误代码,请勿重复。