理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTful API。

怎么理解幂等性

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方法。

from:http://blog.720ui.com/2016/restful_idempotent/

http://www.tuicool.com/articles/E7zeeii

如何理解RESTful的幂等性相关推荐

  1. 如何理解 RESTful 的幂等性

    来源:http://blog.720ui.com/2016/restful_idempotent/ 理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTful API. 怎么理解幂等性 H ...

  2. [转] 理解RESTful架构

    FROM:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件 ...

  3. 理解RESTful架构

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  4. 我是如何根据豆瓣api来理解Restful API设计的

    1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思.它是在Roy Fielding博士论文首次提出.REST本身没有创造新的技术.组件 ...

  5. [转载] 理解RESTful架构

    原文: http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架构 作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意 ...

  6. 理解RESTful架构【转】

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  7. 转: 理解RESTful架构

    转自: http://www.ruanyifeng.com/blog/2011/09/restful.html 作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是 ...

  8. 理解 RESTful

    风格 ⇒ 标准 ⇒ 协议 ⇒ 实现 Representational State Transfer,是一种软件架构风格,既然是风格,就非标准或协议,而是定义了一组设计原则和约束条件.具有如下特点: 适 ...

  9. 理解restful协议

    原文 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency ...

最新文章

  1. 老板和主管不懂SEO,乱给SEO人员下指令怎么办?
  2. thinking-in-java(10)内部类
  3. my_atio()代码出错原因,完全代码
  4. springcloud 创建子父项目_idea搭建springCloud----搭建父子项目(二)
  5. umask:默认权限分配的命令
  6. Pytorch开发环境安装(Windows版本)
  7. Ehcache小结(一)
  8. android文件管理器--界面效果二(layout)
  9. linux glance删除命令,OpenStack Glance v2 API任意文件删除漏洞(CVE-2012-5482)
  10. 多记,多问为什么,最古老的学习方法怎么能丢?!
  11. windows ——adb下载与安装
  12. erp管理系统软件价格
  13. SQL数据库无法附加
  14. 【软件测试】软件测试职业规划
  15. NTL密码算法开源库——大整数ZZ类(四)
  16. obj-c编程11:内存管理和ARC(自动引用计数)
  17. python 东方财富接口_Python从东方财富网站获取数据,python,的
  18. 数学149的女学霸,直言想当程序员!女生当程序员到底行不行?
  19. URL 重写就是把URL地址重新改写(汗^_^)。
  20. umi中使用plugin-initial-state插件(initialState)

热门文章

  1. 主机访问虚拟机中linux上的web服务
  2. 强监管下 协议支付会是互金平台救命稻草?(协议支付是代扣协议的升级版)
  3. 图神经网络学习一(浅谈embedding)
  4. 爬虫学习笔记(三)—— requests库
  5. 运行vc++6.0出现Error spawning cl.exe问题解决方法
  6. leetcode-----给出两个二叉树,请写出一个判断两个二叉树是否相等的函数。
  7. Linux调试——gdb调试器的简单使用调试coredump文件
  8. 华为云服务的购买和建站
  9. 代码高亮_微信公众号代码高亮美化工具 Markdown Nice
  10. python网页优化公司_使用python优化scipy.optimize.minimize公司