Http的幂等性
HTTP幂等方法,是指无论调用这个url多少次,都不会有不同的结果的HTTP方法。
也就是不管你调用1次还是调用100次,1000次,结果都是一样的
探讨GET POST PUT PATCH DELETE 的幂等性
GET /tickets # 获取ticket列表
GET /tickets/12 # 查看某个具体的ticket
POST /tickets # 新建一个ticket
PUT /tickets/12 # 更新ticket 12
PATCH /tickets/12 # 更新ticket 12
DELETE /tickets/12 # 删除ticekt 12
1. HTTP GET方法(幂等性)
HTTP GET方法,用于获取资源,不管调用多少次接口,结果都不会改变,没有副作用,所以是幂等的。
2. HTTP POST方法(非幂等性)
http规范中描述道:
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.
POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。
所以,POST方法不具备幂等性。
HTTP PUT方法(幂等性)
PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;
因此,PUT方法具有幂等性。
HTTP PATCH方法(非幂等性)
HTTP PATCH方法是非幂等的。
HTTP POST方法和HTTP PUT方法可能比较好理解,但是HTTP PATCH方法只是更新部分资源,怎么是非幂等的呢? 因为,PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的资源。换句话说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响。
HTTP DELETE方法(幂等性)
HTTP DELETE方法用于删除资源,会将资源删除。
调用一次和多次对资源产生影响是相同的,所以也满足幂等性。