HTTP协议本身是一种面向资源的应用层协议,但对HTTP协议的使用实际上存在着两种不同的方式:一种是RESTful的,它把HTTP当成应用层协议,比较忠实地遵守了HTTP协议的各种规定;另一种是SOA的,它并没有完全把HTTP当成应用层协议,而是把HTTP协议作为了传输层协议,然后在HTTP之上建立了自己的应用层协议。本文所讨论的HTTP幂等性主要针对RESTful风格的,不过正如上一节所看到的那样,幂等性并不属于特定的协议,它是分布式系统的一种特性;所以,不论是SOA还是RESTful的Web API设计都应该考虑幂等性。下面将介绍HTTP GET、DELETE、PUT、POST四种主要方法的语义和幂等性。

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中。这种模式可以应用于很多场合,比如:论坛网站中防止意外的重复发帖。

            以上摘抄自网络

HTTP协议中的幂等性介绍相关推荐

  1. 深入浅出业务幂等性---1、幂等性介绍与接口幂等

    微服务与幂等性 随着应用架构由单体架构到微服务架构进行演变,现如今市面上超过50%的应用都会基于分布式或微服务完成系统架构设计.在微服务架构体系内,就会存在若干个微服务,这些服务可能基于RPC或者HT ...

  2. 分布式系统中的幂等性

    分布式系统中的幂等性 分布式系统中的幂等性 1.幂等性介绍 2.幂等性场景 3.crud操作的幂等性分析 4.如何解决幂等性问题 分布式系统中的幂等性 1.幂等性介绍 幂等的概念来自数学,比如对于一元 ...

  3. Http协议中Get和Post的浅谈

    起名困难户,每次写文章最愁的就是不知道该如何起个稍具内涵的名字,如果这篇文章我只是写写Get和Post的区别,我可以起个名字"Get和Post的那点事",如果打算阐述一下Http协 ...

  4. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  5. Http协议中的方法

    http://blog.csdn.net/macroway/article/details/1428541 孟岩老师将"REST"称为一场Web开发思想的变革,而就我个人理解而言, ...

  6. 理解HTTP协议中的multipart/form-data

    前提 之前在写一个通用HTTP组件的时候遇到过媒体(Media)类型multipart/form-data的封装问题,这篇文章主要简单介绍一下HTTP协议中媒体类型multipart/form-dat ...

  7. HTTP协议中的Content-Encoding

    HTTP协议中的Content-Encoding 主要内容 1.Content-Encoding是什么     2.内容编码格式gzip和deflate Content-Encoding是什么 Acc ...

  8. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

  9. python url模块介绍_python 中 urlparse 模块介绍

    urlparse模块主要是用于解析url中的参数  对url按照一定格式进行 拆分或拼接 1.urlparse.urlparse 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路 ...

最新文章

  1. C#命名规则、开发习惯和风格
  2. unity开宝箱动画_[技术博客]Unity3d 动画控制
  3. 聊一聊,用户画像的前世今生
  4. pmp每日三题(2022年3月10日)
  5. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...
  6. 一个edit的学习笔记
  7. mysql触发器区分新增 修改_MySQL触发器 , 判断更新操作前后数据是否改变
  8. 助你解决新手开车四大问题 为您支招
  9. gis python 桌面,arc-utils-用于Esri ArcGIS桌面软件的Python实用程序-Grant Herbert
  10. 【阿里云EMR实战篇】以EMR测试集群版本为例,详解 Flink SQL Client 集成 Hive 使用步骤
  11. ECS主动运维2.0,体验升级,事半功倍
  12. 什么是 XDoclet?
  13. 《天谕》全新PBR技术曝光 布料纹路清晰可见
  14. matlab教程曲线拟合,matlab 曲线拟合
  15. 计算机软件 退货,如何在在电脑收银系统中实现商品退货
  16. hr面试性格测试30题_网友应聘华为表现优秀,最终却挂在性格测试上,看真题我哭……...
  17. [独立游戏][纳税]个人独立游戏缴税纳税相关问题
  18. HTML+JavaScript简单搜索功能实现
  19. Kafka Sql:简单使用
  20. 教你如何安慰失戀人?

热门文章

  1. 90%、80%成本 集中度
  2. Vs2019集成Teigha4.0
  3. Win11C盘满了怎么清理?Win11清理C盘的方法
  4. 加入域的电脑,使用域管理员账号时出现 “Windows 无法访问指定设备、路劲或文件。你可能没有适当的权限访问该项目”
  5. 基于Java毕业设计宠物医院管理系统源码+系统+mysql+lw文档+部署软件
  6. PyCharm汉化:简单两步搞定!PyCharm怎么设置中文简体,为什么我的pycharm搜不到中文语言包(Chinese ​(Simplified)​ Language Pack)
  7. Ubiq:A Scalable and Fault-tolerant Log Processing Infrastructure
  8. Ajax基本使用与JSON格式转换
  9. 缩写(二)——IT领域缩写词的发音
  10. 带本科生作工程实习(1)