API Testing 入门基础系列 之 API Testing 6 - 等幂的HTTP方法
在上篇《API Testing 5 -安全的http方法》文中我们将HTTP 方法归类为安全和不安全方法。本文我们将HTTP方法归类成等幂和非等幂方法。
Idenpotent等幂概念
首先了解一下Idempotent [aɪ’dempətənt](等幂)的概念:
我的名字叫Kelly,如果你问我的名字,我会说Kelly。如果你的朋友问,我会说Kelly。任何一个人问我的名字,我都会说Kelly。我的名字不会随着不同的人问,问多少次而改变,这就是等幂的概念。
我有一块表显示当前时间,如果你问我时间,我会说当前时间是10:52:35;如果你的朋友问我,我会说当前问我时的最新时间,每次问时,当前时间都会不同,这就是非等幂。
HTTP方法中的等幂概念
同样的概念也适用于HTTP方法。
如果一个HTTP方法执行一次或多次都得到相同的返回结果,被称为等幂方法。例如:一个GET方法用来获取我的名字Kelly,它将总是返回“Kelly”,不管是一次调用,还是反复多次调用。当然如果有其它方法更新我的名字成Carey,将返回不同于更新前的名字。
我们将上面的描述换一种说法:
对于同一个HTTP方法,进行多次请求得到的服务器端资源状态和第一次请求(注意是跟第一次请求对比
)时返回的服务器端资源状态是相同的,我们就称为等幂的HTTP方法。也就是说,你发起一个请求,对资源执行改变或着不改变资源状态操作,现在你又发起同样的请求,进行相同的操作,没有新的改变发生。
举例:
假设一个GET请求是等幂的,你发起GET请求获取我的名字,在响应里你将得到我的名字Kelly和一个当前的时间戳。当你再一次发起GET请求时,你将得到我的名字Kelly,但是时间戳不同。所以等幂跟客户端收到的响应没有关系,它考虑的是多次调用后服务器端资源状态是怎样的。GET请求在第一次调用时不改变任何资源,这也是我为什么在上面的括号中特别强调对比对象第一次调用。这个方法更恰当地归为幂零的。
一个PUT方法用来更新资源状态,也就是说它更新我的名字为Carey。现在不管你发起多少次相同的请求,它将不影响反复重写相同的值。所以多次相同的PUT请求不会影响第一次请求后的资源状态。我的名字是Kelly,第一次调用PUT方法将我的名字改成Carey,后面多次调用相同的PUT方法,我的名字始终是改成了Carey,跟第一次PUT请求的结果是一样的。
通过以上内容,你应该明白等幂的概念吧。下面的表格就是将HTTP方法归类为等幂和非等幂。
为啥PUT 等幂,PATCH非等幂?
看到这里,你是否会有疑惑,为啥PUT是等幂的,而PATCH是非等幂的?本人也是参考《为什么 HTTP PATCH 方法不是幂等的及其延伸》才弄明白了。
PUT 和 PATCH 请求的区别体现在服务器处理封闭实体以修改 Request-URI 标志的资源的方式。
在一个 PUT 请求中,封闭实体被认为是存储在源服务器上的资源的修改版本,并且客户端正在请求替换存储的版本。
而对于 PATCH 请求,封闭实体中包含了一组描述当前保留在源服务器上的资源应该如何被修改来产生一个新版本的指令
。
PATCH 方法影响由 Request-URI 标志的资源,而且它也可能对其他资源有副作用;也就是,通过使用 PATCH,新资源可能被创造,或者现有资源被修改。
可以理解为,
PATCH 请求中的实体保存的是修改资源的指令
,该指令指导服务器来对资源做出修改,所以不是幂等的。
可能有点抽象,打个比方: 对于存在服务器中的 A 对象有个属性 B 为 1,如果要修改 B 属性为 3,
则 PUT 请求是直接将修改过 B 属性的整个新对象发送给服务器查找并替换。
而 PATCH 请求是在实体中包含指令 — 将 A 对象中 B 属性的值加 2,那么如果该请求被执行多次的话,B 属性就可能不为 3 了,
而 PUT 请求不论执行多少次,B 属性永远都是 3,
所以说PUT 方法是幂等的,而 PATCH 方法不是幂等的
。