sky

很久没有归纳梳理过学过的知识点,作为一个笔记陆续记下来。

DOM

EVENT

RESTful 幂等性

幂等与安全的方法

安全方法是指不修改资源的 HTTP 方法。譬如,当使用 GET 或者 HEAD 作为资源 URL,都必须不去改变资源。然而,这并不全准确。意思是:它不改变资源的表示形式。对于安全方法,它仍然可能改变服务器上的内容或资源,但这必须不导致不同的表现形式。

安全方法和幂等操作并没有直接联系,例如 GET 是个安全方法:

GET /tickets/12/delete

这样的 GET 操作实际会影响到资源状态,当无论你调用多少次,始终只会删除一个资源,所以这个操作是幂等的,RESTful 幂等性关注的多次操作影响是不是一直的。

简单理解:RESTful 的幂等操作,是指无论操作多少次每次操作的资源结果都是相同。

GET

GET 是个幂等操作,GET 的操作无论调用多少次都不会影响资源本身。

POST

POST 是典型的非幂等操作,POST 典型的操作就是新增一个资源项目,每次调用的都会产生的新的资源。

PUT

PUT 呢?例如下面这个操作

PUT /tickets/12 # 更新 ticket 12

因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的 HTTP 方法,所以满足幂等性。

PATCH

PATCH 呢?感觉上和 PUT 是一样的,但其实不然。

PATCH 方法是非幂等的。POST 方法和 PUT 方法可能比较好理解,但是 PATCH 方法只是更新部分资源,怎么是非幂等的呢?

因为,PATCH 提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的资源。换句话说,PATCH 请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响,这就可以解释它为什么是非幂等的了。

可能你还不能理解这点。我们举个例子

PATCH /tickets/12 # 更新 ticket 12

此时,我们服务端对方法的处理是,当调用一次方法,更新部分字段,将这条ticket记录的操作记录加一,这次,每次调用的资源是不是变了呢,所以它是有可能是非幂等的操作。

DELETE

DELETE 方法用于删除资源,会将资源删除。

DELETE /tickets/12 # 删除 ticekt 12

调用一次和多次对资源产生影响是相同的,所以也满足幂等性。

参考链接: