计网与幂等indempotent

indempotent

semantic上就如幂等函数、幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行

会对系统造成改变。

http幂等(rfc2616 :9.1.2 Idempotent Methods)

  Methods can also have the property of "idempotence" in that (aside

  from error or expiration issues) the side-effects of N > 0 identical

  requests is the same as for a single request. The methods GET, HEAD,

  PUT and DELETE share this property. Also, the methods OPTIONS and

  TRACE SHOULD NOT have side effects, and so are inherently idempotent.

 

  However, it is possible that a sequence of several requests is non-

  idempotent, even if all of the methods executed in that sequence are

  idempotent. (A sequence is idempotent if a single execution of the

  entire sequence always yields a result that is not changed by a

  reexecution of all, or part, of that sequence.) For example, a

  sequence is non-idempotent if its result depends on a value that is

  later modified in the same sequence.

 

  A sequence that never has side effects is idempotent, by definition

  (provided that no concurrent operations are being executed on the

  same set of resources).

从2616上的解释可以看到,http的幂等是指 这个请求方法没有副作用,或者一个请求序列没有副作用。

在9.6 put这一节,解释了post和put的区别:

 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. If a

  new resource is created, the origin server MUST inform the user agent

  via the 201 (Created) response. If an existing resource is modified,

  either the 200 (OK) or 204 (No Content) response codes SHOULD be sent

  to indicate successful completion of the request. If the resource

  could not be created or modified with the Request-URI, an appropriate

  error response SHOULD be given that reflects the nature of the

  problem. The recipient of the entity MUST NOT ignore any Content-*

  (e.g. Content-Range) headers that it does not understand or implement

  and MUST return a 501 (Not Implemented) response in such cases.

 

  If the request passes through a cache and the Request-URI identifies

  one or more currently cached entities, those entries SHOULD be

  treated as stale. Responses to this method are not cacheable.

 

  The fundamental difference between the POST and PUT requests is

  reflected in the different meaning of the Request-URI. The URI in a

  POST request identifies the resource that will handle the enclosed

  entity. That resource might be a data-accepting process, a gateway to

  some other protocol, or a separate entity that accepts annotations.

  In contrast, the URI in a PUT request identifies the entity enclosed

  with the request -- the user agent knows what URI is intended and the

  server MUST NOT attempt to apply the request to some other resource.

  If the server desires that the request be applied to a different URI,

  it MUST send a 301 (Moved Permanently) response; the user agent MAY

  then make its own decision regarding whether or not to redirect the

  request.

 

 

rfc2616在99年提出,2016年废弃。拆分到rfc7230-rfc7235六个Request For Comments;