等幂性 Idenpotence
一次或多次请求某个资源应该具有同样的副作用。
例如:有一个取钱的远程 API bool withdraw(account_id, amount);
。
假设用户在 ATM 机上点击一次取钱按钮,服务端操作成功,更新了余额。但是由于网络原因,ATM 机上并没有相应,客户以为取钱不成功,又点击了一次取钱按钮,从而导致服务端实际上执行了两次 withdraw 操作。
以上设计就是非等幂的!
等幂的设计如下:
服务端先产生一个唯一的处理号 int create_ticket_id();
将 API 修改为 bool withdraw(account_id, ticket_id, amount);
同一个 ticket_id
多次调用都将返回第一次调用时的结果。
4 个 HTTP 动词是否具有等幂性
- GET:获得资源,多次调用不会改变资源的状态,即无副作用,因此是等幂的。
- POST:新建资源,多次调用的副作用不相同,创建出多份资源,因此是不等幂的。
- PUT:更新资源,多次调用的副作用相同,因此是等幂的。
- DELETE:删除资源,有副作用,但是多次调用的结果是一样的,因此是等幂的。