Http 带REST的PUT/DELETE幂等元是自动的吗?

Http 带REST的PUT/DELETE幂等元是自动的吗?,http,rest,Http,Rest,我正在学习REST和PUT/DELETE,我读到这两个(以及GET)都是幂等的,这意味着多个请求将服务器置于相同的状态 重复的PUT/DELETE请求是否会离开web浏览器(使用XMLHttpRequest时)?换句话说,服务器会为每个PUT请求更新相同的数据库记录,还是会自动忽略重复的请求 如果是,使用PUT或DELETE与仅使用POST有何不同 我读了一篇文章,其中指出RESTfulWeb服务是前进的方向。HTML5表单不支持PUT/DELETE方法有什么特别的原因吗?REST只是一种用于数

我正在学习REST和PUT/DELETE,我读到这两个(以及GET)都是幂等的,这意味着多个请求将服务器置于相同的状态

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

如果是,使用PUT或DELETE与仅使用POST有何不同


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

REST只是一种用于数据访问和操作的设计结构。对于服务器必须如何响应数据请求,没有固定的规则

也就是说,
PUT
DELETE
的REST请求通常如下所示:

DELETE /item/10293

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

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

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

DELETE /item/last
打15次电话可能会删除15项,而不是最后一项。正确使用HTTP的替代方案可能如下所示:

POST /item/last?action=delete
再说一遍,REST并不是一个官方规范,它只是一个具有一些共同特性的结构。有许多方法可以实现RESTful结构


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

随着web的发展,一个好的RESTful实现也很可能包含某种形式的AJAX,因此对我来说,它似乎基本上是不必要的

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

是的,当然。幂等性只是一种约定,它不是强制的。如果您提出请求,无论是否重复,它都将运行

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

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

如果是,使用PUT或DELETE与仅使用POST有何不同

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

我读了一篇文章,其中指出RESTfulWeb服务是前进的方向。HTML5表单不支持PUT/DELETE方法有什么特别的原因吗


老实说,我不是很确定。您可以使用名为
\u method
或类似的隐藏
字段来解决此问题,并将其设置为DELETE或PUT,然后处理该服务器端。

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

没有什么是自动的。只有当接收请求的服务器是真正的RESTful并以幂等方式实现它们时,它们才是幂等的。我写这篇文章不是为了回答这个问题,因为它与StackOverflow的主题无关。询问您是否必须询问。您可能还想查看以下答案:即使HTML5规范不支持PUT/DELETE,XMLHttpRequest仍将支持PUT/DELETE。正确的?这将是另一个解决办法。我猜浏览器对规范的重视程度也是如此。@Deep:是的,但从技术上讲,它与HTML表单无关,这正是他所问的:sidemponence不仅仅是一种约定,它是服务器对客户端(和中介)的承诺。但是,作为服务的实现者,您有责任履行(或违背)该承诺。这并不是强制执行的,而是中介机构(即代理人)根据该承诺做出假设,如果该承诺不真实,则可能会对您的服务或客户产生不良后果。与POST的唯一区别在于POST没有对安全性或幂等性做出任何承诺,因此代理不会对此做出任何假设。Re:“重复的PUT/DELETE请求是否会离开web浏览器”-web浏览器本身不会多次发出这些请求。如果TCP堆栈将错误返回到浏览器,它应该向JavaScript代码报告,代码需要再次尝试发送错误,这是安全的,按照规范执行。REST不是官方规范,但它只是提醒我们不要使用新方法偏离HTTP或向事务添加状态。因此,像
DELETE/item/last
这样的请求不是幂等的,因此不应该使用它。例如,浏览器会在回击时再次发送请求,而不要求用户确认。另外,
POST/item/last?action=delete
似乎是个坏主意,你如何保证你正在删除你打算删除的资源?@JuanMendes,好主意。实际上,我在最后讨论了这个问题,我可能应该修改这个答案以反映更好的方法。根据方法GET,HEAD,PUT和DELETE是幂等的。所以不允许使用DELETE/item/last,就像不允许使用GET/item/last一样
POST /item/last?action=delete