这篇文章是参考别人的,https://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html

HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。

为什么需要幂等性呢?假设有一个从账户取钱的远程API(可以是HTTP的,也可以不是),暂时记为:

func withdraw(account_id, amount) bool{}

withdraw的语义是从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。假如withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。

这个问题的解决方案一是采用分布式事务,通过引入支持分布式事务的中间件来保证withdraw功能的事务性。

另一种更轻量级的解决方案是幂等设计。我们可以通过一些技巧把withdraw变成幂等的,比如:

func create_ticket() int{}
func idempotent_withdraw(ticket_id, account_id, amount)  bool{}

create_ticket的语义是获取一个服务器端生成的唯一的处理号ticket_id,它将用于标识后续的操作。idempotent_withdraw和withdraw的区别在于关联了一个ticket_id,一个ticket_id表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果。这样,idempotent_withdraw就符合幂等性了,客户端就可以放心地多次调用。

基于幂等性的解决方案中一个完整的取钱流程被分解成了两个步骤:

1.调用create_ticket()获取ticket_id;
2.调用idempotent_withdraw(ticket_id, account_id, amount)。虽然create_ticket不是幂等的,但在这种设计下,它对系统状态的影响可以忽略,加上idempotent_withdraw是幂等的,所以任何一步由于网络等原因失败或超时,客户端都可以重试,直到获得结果。

HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。

HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。

比如:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。

比较容易混淆的是HTTP POST和PUT。POST和PUT的区别容易被简单地误认为“POST表示创建资源,PUT表示更新资源”;而实际上,二者均可用于创建资源,更为本质的差别是在幂等性方面。

POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。而PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。

来看看如何通过Web API的形式实现前面所提到的取款功能:

很简单,用POST /tickets来实现create_ticket;用PUT /accounts/account_id/ticket_id&amount=xxx来实现idempotent_withdraw。值得注意的是严格来讲amount参数不应该作为URI的一部分,真正的URI应该是/accounts/account_id/ticket_id,而amount应该放在请求的body中。这种模式可以应用于很多场合,比如:论坛网站中防止意外的重复发帖。

POST 方法比 GET 方法安全?

有人说POST 比 GET 安全,因为数据在地址栏上不可见。
然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。
要想安全传输,就只有加密,也就是 HTTPS

go开发之restful等幂性相关推荐

  1. 苹果开发之Cocoa编程(原书第4版)

    <苹果开发之Cocoa编程(原书第4版)> 基本信息 原书名:Cocoa Programming for Mac OS X: Fourth Edition 作者: (美)希莱加斯(Hill ...

  2. 框架开发之Java注解的妙用

    框架开发之Java注解的妙用 注解的好处: 1.能够读懂别人写的代码,特别是框架相关的代码. 2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程 ...

  3. 从全职高手开始的系统_动画全职高手第二季热血回归,腾讯视频的国漫IP全链路开发之道...

    这个国庆档,国产动画在内容市场上的存在感比想象中更加有分量.电影市场上,动画IP电影<姜子牙>完成票房领跑,掀起观影热潮:动画番剧市场上,头部IP动画<全职高手>第二季时隔三年 ...

  4. [转]敏捷开发之Scrum扫盲,及敏捷开发中XP与SCRUM的区别

    敏捷开发之Scrum扫盲篇 现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP- 为了不落后他人,于是我也开始学习Scrum,今天主要是对我最近阅读的相关资料,根据自己的理解,用自 ...

  5. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

  6. 嵌入式开发之NorFlash 和NandFlash

    嵌入式开发之NorFlash 和NandFlash 转自:http://blog.csdn.net/tigerjb/article/details/9322035 [摘要]:作为一个嵌入式工程师,要对 ...

  7. 安卓系统层开发之C++

    VIP01-2020.10.22-C语言基础01-地址总线原理 数据类型 结构类型 struct sizeof 是测量person堆区分配的大小 #include <stdio.h> #i ...

  8. 新浪微博客户端开发之adapter

    新浪微博客户端开发之adapter 2013年11月23日 新浪微博客户端系列博客记录 之前获取首页微博列表还没有介绍adapter,关于adapter可以分出来一块来讲,用过ListView的童鞋们 ...

  9. DirectX游戏开发之2D文字的实现

    DirectX游戏开发之2D文字的实现 文字是承载信息最有效的载体之一,各种游戏程序都离不开文字的显示.对于3D文字来说,2D文字有其渲染的高效性和实现的简洁性. 2D文字的显示无论在写2D游戏还是在 ...

最新文章

  1. 经典 | 吴恩达《机器学习落地应用指南》(30页ppt)
  2. Confluence 6 配置 HTTP 超时设置
  3. Cisco路由交换--NAT详解一
  4. POJ - 2774 Long Long Message(后缀数组)
  5. 可以自动化部署吗_从自动化测试到持续部署,你需要了解这些!
  6. C++传递数组给函数
  7. Internet Explorer更改MIME处理方式以提高安全性
  8. linux驱动加载 动态加载 静态加载 自动加载
  9. SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming
  10. 服务器上qq打不开网页,能上qq打不开网页的解决方法
  11. Attiny48单片机编程经验总结
  12. 圆周率:山颠一寺一壶酒
  13. Android ListView 异步加载图片
  14. 免费Bootstrap后台管理模板
  15. 微信小程序汇率计算界面
  16. 工业物联网的价值有哪些
  17. broker-list与bootstrap-server辨析
  18. 二维图形的基本变换与裁剪的变换矩阵
  19. 小基础设施团队的分工思路
  20. 随笔:使用Windows搭建AAA认证服务器

热门文章

  1. matlab语音算法,[转载]RLS算法多麦克风语音降噪( matlab编程 )
  2. 【实战记录】使用阿里云的OSS云存储,上传与删除图片及遇到的问题
  3. 我的世界服务器没有显示物品ID,我的世界物品ID不显示怎么办
  4. android高级UI之Paint Xfermode
  5. [附源码]Python计算机毕业设计SSM流浪动物救助及领养平台(程序+LW)
  6. Java中生产者和消费者总结
  7. JS验证身份证号地区码及最后一位校验码
  8. 卓有成效的管理:你逃不过的功课你要完成它
  9. 01_邂逅vue3开发
  10. 华中科技大学2021年博士研究生招生简章