文档章节

如何理解RESTful的幂等性

Kxvz
 Kxvz
发布于 2017/11/22 09:36
字数 1285
阅读 27
收藏 0

怎么理解幂等性

HTTP幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。

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


HTTP GET方法

HTTP GET方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。

GET     /tickets       # 获取ticket列表
GET     /tickets/12    # 查看某个具体的ticket


只是查询数据,不会影响到资源的变化,因此我们认为它幂等。

值得注意,幂等性指的是作用于结果而非资源本身。怎么理解呢?

例如,这个HTTP GET方法可能会每次得到不同的返回内容,但并不影响资源。

可能你会问有这种情况么?当然有咯。例如,我们有一个接口获取当前时间,我们就应该设计成

GET     /service_time # 获取服务器当前时间

它本身不会对资源本身产生影响,因此满足幂等性。

HTTP POST方法

HTTP POST方法是一个非幂等方法,因为调用多次,都将产生新的资源。

POST    /tickets       # 新建一个ticket


因为它会对资源本身产生影响,每次调用都会有新的资源产生,因此不满足幂等性。

HTTP PUT方法

HTTP PUT方法是不是幂等的呢?我们来看下

PUT     /tickets/12    # 更新ticket 12


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

HTTP PATCH方法

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

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

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

PATCH   /tickets/12    # 更新ticket 12


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

HTTP DELETE方法

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

DELETE  /tickets/12    # 删除ticekt 12


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

 

如何设计符合幂等性的高质量RESTful API

HTTP GET方法 vs HTTP POST方法

也许,你会想起一个面试题。HTTP请求的GET与POST方式有什么区别?你可能会回答到:GET方式通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。但是,我们现在从RESTful的资源角度来看待问题,HTTP GET方法是幂等的,所以它适合作为查询操作,HTTP POST方法是非幂等的,所以用来表示新增操作。

但是,也有例外,我们有的时候可能需要把查询方法改造成HTTP POST方法。比如,超长(1k)的GET URL使用POST方法来替代,因为GET受到URL长度的限制。虽然,它不符合幂等性,但是它是一种折中的方案。

HTTP POST方法 vs HTTP PUT方法

对于HTTP POST方法和TTP PUT方法,我们一般的理解是POST表示创建资源,PUT表示更新资源。当然,这个是正确的理解。

但是,实际上,两个方法都用于创建资源,更为本质的差别是在幂等性。HTTP POST方法是非幂等,所以用来表示创建资源,HTTP PUT方法是幂等的,因此表示更新资源更加贴切。

HTTP PUT方法 vs HTTP PATCH方法

此时,你看会有另外一个问题。HTTP PUT方法和HTTP PATCH方法,都是用来表述更新资源,它们之间有什么区别呢?我们一般的理解是PUT表示更新全部资源,PATCH表示更新部分资源。首先,这个是我们遵守的第一准则。根据上面的描述,PATCH方法是非幂等的,因此我们在设计我们服务端的RESTful API的时候,也需要考虑。如果,我们想要明确的告诉调用者我们的资源是幂等的,我的设计更倾向于使用HTTP PUT方法。

 

原文链接:http://blog.720ui.com/2016/restful_idempotent/

© 著作权归作者所有

Kxvz
粉丝 12
博文 106
码字总数 29791
作品 0
成都
程序员
私信 提问
RESTful - 收藏集 - 掘金

远程接口设计经验分享 - 后端 - 掘金 写在前边 分布式架构是互联网应用的基础架构,很多新人入职以来就开始负责编写和调用阿里的各种远程接口。但如同结婚一般,用对一个正确的接口就如同嫁一...

掘金官方
2017/05/26
0
0
[转]HTTP幂等性概念和应用

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流行呢?我认为...

穿越星辰
2011/06/27
0
0
简单识别 RESTful 接口

本文描述了识别一个接口是否真的是 RESTful 接口的基本方法。符合 REST 架构风格的接口,称为 RESTful 接口。本文不打算从架构风格的推导方面描述,而是从 HTTP 标准的方面描述。识别的方法同...

heiing
2015/05/23
0
0
RESTful 真正意味着什么?

上个月,我在Skillsmatter参加了一个关于RESTful微服务快速进阶的培训课程。课程着重探讨了REST API在web应用和微服务交互方面起到的作用。对我来说,这个课程给我最大的收获是让我更好地理解...

oschina
2016/08/05
17.7K
10
HTTP_幂等性_idempotence_PUT的幂等性

HTTP幂等性idempotence_PUT的幂等性 http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html 数学上的幂等性 数学上的幂等,我们在这里讲个例子,体会一下数学上的幂等。...

秋风醉了
2014/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

马蜂窝 IM 系统架构的演化和升级

今天,越来越多的用户被马蜂窝持续积累的笔记、攻略、嗡嗡等优质的分享内容所吸引,在这里激发了去旅行的热情,同时也拉动了马蜂窝交易的增长。在帮助用户做出旅行决策、完成交易的过程中,I...

马蜂窝技术
31分钟前
3
0
C++学习笔记:C/C++中static关键词有用途

C语言中:static关键词有三种用途 1.静态局部变量 特点: 该变量在全局数据区分配内存(局部变量在栈区分配内存) 静态局部变量在程序执行到该对象的声明处时被首次初始化,以后不会再进行初...

StupidZhe
32分钟前
2
0
Mysql Group Replication关闭和启动所有的组成员的注意点

Mysql Group Replication关闭和启动所有的组成员的注意点 2018年05月17日 11:45:02 zuozhiji 阅读数 1772 由于的我mgr建立在虚拟机上面(即使是正式环境,如果计划内的停机或者断电都需要关闭...

rootliu
36分钟前
2
0
并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能...

阿里云官方博客
36分钟前
2
0
iTOP-4412开发板基于Linux-C测试程序的编译和运行

iTOP-4412 开发板可以运行的文件系统很多,在具体的文件系统上实现特定功能前,可 以使用 Linux-C 程序来测试硬件以及驱动。而且这些程序很容易移植到 Android、Qt/E 以及 最小文件系统上。 ...

书白
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部