HTTP_幂等性_idempotence_PUT的幂等性html
http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html服务器
数学上的幂等,咱们在这里讲个例子,体会一下数学上的幂等。分布式
设f为一由X映射至X的一元运算,则f为幂等的,当对于全部在X内的x,ide
f(f(x)) = f(x).函数
特别的是,恒等函数必定是幂等的,且任一常数函数也都是幂等的。spa
其余的幂等概念都是从数学上的幂等引伸出去的。设计
HTTP协议自己是一种面向资源的应用层协议,但对HTTP协议的使用实际上存在着两种不一样的方式:一种是RESTful的,它把HTTP当成应用层协议 ,比较忠实地遵照了HTTP协议的各类规定;另外一种是SOA的,它并无彻底把HTTP当成应用层协议,而是把HTTP协议做为了传输层协议,而后在HTTP之上创建了本身的应用层协议。本文所讨论的HTTP幂等性主要针对RESTful风格的,幂等性并不属于特定的协议,它是分布式系统的一种特性;因此,不管是SOA仍是RESTful的Web API设计都应该考虑幂等性。下面将介绍HTTP GET、DELETE、PUT、POST四种主要方法的语义和幂等性。server
HTTP GET方法用于获取资源,不该有反作用,因此是幂等的。好比:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次仍是N次都没有反作用。请注意,这里强调的是一次和N次具备相同的反作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次获得不一样的结果,但它自己并无产生任何反作用,于是是知足幂等性的。htm
HTTP DELETE方法用于删除资源,有反作用,但它应该知足幂等性。好比:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的反作用是相同的,即删掉id为4231的帖子;所以,调用者能够屡次调用或刷新页面而没必要担忧引发错误。blog
比较容易混淆的是 HTTP POST和PUT。POST和PUT的区别容易被简单地误认为“POST表示建立资源,PUT表示更新资源”;而实际上,两者都可用于建立资源,更为本质的差异是在幂等性方面。在HTTP规范中对POST和PUT是这样定义的:
The POST method is used to request that the origin server accept the entity enclosed(封闭) in the request as a new subordinate(下属) of the resource identified by the Request-URI in the Request-Line ...... If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.
The PUT method requests that the enclosed(封闭的) entity be stored under the supplied(提供) Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing(居住在) on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable(能) of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
POST所对应的URI并不是建立的资源自己,而是资源的接收者。好比:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下建立一篇帖子,HTTP响应中应包含帖子的建立状态以及帖子的URI。两次相同的POST请求会在服务器端建立两份资源,它们具备不一样的URI;因此,POST方法不具有幂等性。而PUT所对应的URI是要建立或更新的资源自己。好比:PUT http://www.forum/articles/4231的语义是建立或更新ID为4231的帖子。对同一URI进行屡次PUT的反作用和一次PUT是相同的;所以,PUT方法具备幂等性。
==========END==========