`

<转载>HTTP的幂等性

    博客分类:
  • http
 
阅读更多

 

来源: http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html

作者: Todd Wei

 

幂等性的定义

HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它.

 

HTTP的幂等性

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表示更新资源”;而实际上,二者均可用于创建资源,更为本质的差别是在幂等性方面。

 

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

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

 

 

分享到:
评论

相关推荐

    MYSQL培训经典教程(共两部分) 1/2

    priv和columns_priv的权限列的内容 155&lt;br&gt;7.1.4权限系统工作原理 155&lt;br&gt;7.1.4.1权限系统工作的一般过程 155&lt;br&gt;7.1.4.2存取控制, 阶段1:连接证实 156&lt;br&gt;7.1.4.3存取控制,阶段2:请求证实 159&lt;br&gt;7.1.5 总结 161...

    MYSQL培训经典教程(共两部分) 2/2

    priv和columns_priv的权限列的内容 155&lt;br&gt;7.1.4权限系统工作原理 155&lt;br&gt;7.1.4.1权限系统工作的一般过程 155&lt;br&gt;7.1.4.2存取控制, 阶段1:连接证实 156&lt;br&gt;7.1.4.3存取控制,阶段2:请求证实 159&lt;br&gt;7.1.5 总结 161...

    电脑实用 快捷键大全

    转载于“就爱源码站” 第1节 word 快捷键 &lt;br&gt; 第2节 Excel 快捷键 &lt;br&gt; 第3节 Internet Explorer快捷键 &lt;br&gt; &lt;br&gt; 第4节 Windows 快捷键 &lt;br&gt; 第5节 Freehand 快捷键 &lt;br&gt; 第6节 protel99 快捷键 &lt;br&gt; &lt;br&gt; 第7节 ...

    Scratch闯关游戏作品:「离子反应」

    双人:&lt;J&gt;/&lt;1&gt;射击,&lt;Q&gt;/&lt;5&gt;丢弃物品,&lt;R&gt;/&lt;0&gt;填充药剂,&lt;K&gt;&lt;L&gt;/&lt;2&gt;&lt;3&gt;切换武器,&lt;E&gt;/&lt;4&gt;拾取,&lt;W&gt;&lt;S&gt;&lt;A&gt;&lt;D&gt;/&lt;↑&gt;&lt;↓&gt;&lt;←&gt;&lt;→&gt;移动。 作弊按键:p 跳关 o 回血。 武器:滴管、玻璃棒、广口瓶、锥形瓶、烧瓶、试管 ...

    <转载>ThinkAndroid

    ThinkAndroid强调的是模块化、可扩展性和可维护性。通过将应用程序分解为可重用的组件,开发者可以更轻松地管理和维护大型项目。此外,它还包含了丰富的工具集,可以帮助开发者快速构建功能丰富的应用。 1. **模块...

    IntelliJ IDEA插件开发手册

    转载的,作者忘了,不好意思.&lt;br&gt;&lt;br&gt;这个手册主要帮助IntelliJ IDEA的开发人员快速了解IntelliJ IDEA的插件结构,并能编写自己的插件。这个手册主要包含以下内容: &lt;br&gt;&lt;br&gt; 开发准备 &lt;br&gt; IntelliJ IDEA的IoC介绍 ...

    在线收藏夹插件 for dvbbs 6.0

    在线收藏夹&lt;br&gt; &lt;br&gt; old-version studio 全力制作、提供。&lt;br&gt; &lt;br&gt; 1、把你的收藏夹搬到网上,可随时随地找到您想要的网址。...&lt;br&gt; &lt;br&gt; http://www.houniao.com&lt;br&gt; (老版本工作室 版权所有) 转载请注明版权

    简单的网页内容采集器(C#)

    预览图片见:http://www.cnblogs.com/xxpyeippx/archive/2008/03/31/1131211.html&lt;br&gt;运行环境&lt;br&gt;windows nt/xp/2003 or above&lt;br&gt;.net Framework 1.1...&lt;br&gt;&lt;br&gt;Surance Yin@ Surance Center &lt;br&gt;转载请注明出处 &lt;br&gt;

    PHP实用指南 0.23

    前言&lt;br&gt;在学习PHP过程中,比较痛苦的...&lt;br&gt;&lt;br&gt;未经文章作者同意,不得将本资料用于商业用途,转载请注明出处和作者。&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;当前版本 0.23,本资料更新的信息发布点之一为文锋(lightsaber)的blog:&lt;br&gt;

    Fancy v2003 测试版(72B整站程序)

    72B Fancy / 72B整站程序 &lt;br&gt; 程序版本:Fancy Version...IE5.01及以上版本&lt;br&gt; &lt;br&gt; 【联系方式】&lt;br&gt; QQ:84563700&lt;br&gt; 电话:021-54368215&lt;br&gt; 网址:http://www.72b.net&lt;br&gt; &lt;br&gt; 欲转载本程序,请保留以上信息。

    爱之网影视中心插件 dvbbs 6.0

    作者不对使用本插件的后果负任何责任,并不对其作任何技术支持&lt;br&gt; &lt;br&gt; 3/ 转载说明:&lt;br&gt; 任何网站在不对本插件(包括本说明文件)做任何改动的情况下可以自由转载&lt;br&gt; &lt;br&gt; 4/ BUG报告和修复&lt;br&gt; 如果使用本插件...

    《Access 2000教程》未知

    语言 &lt;BR&gt; 第十七课 SQL语言妙用 &lt;BR&gt; 第十八课 外部数据的使用 &lt;BR&gt; 第十九课 数据的优化和安全 &lt;BR&gt; 第二十课 容易忽略的工作 &lt;P&gt; 本网上转载的电子书籍纯粹是作为个人编程参考,不作为商业用途,建议你购买...

    harsonliao的样品室物料管理程序access2000;access2002

    说 明:由于harsonliao在上载时出现问题,我帮其转载上来&lt;BR&gt;这是个非常不错的程序&lt;BR&gt;-珍興樣品室物料管理系統 V1.1- &lt;BR&gt;&lt;BR&gt;通过这两天的结果看来,依靠出售代码换取报酬还是行不大通,但如果没有一点利益,...

    Oracle Concepts 中文英文对照版 (10g R2)

    Oracle Concepts 中文版 (10g R2) 订阅 RSS&lt;br&gt; &lt;br&gt;&lt;br&gt;--------------... Object Datatypes and Object Views 第 27 章,对象数据类型及对象视图 &lt;br&gt;&lt;br&gt;转载请注明出处,谢谢合作。&lt;br&gt;&lt;br&gt;zw1840@hotmail.com &lt;br&gt;

    web前端工程狮 HTML 笔记

    表单(&lt;form&gt;)用于收集用户输入,常见的表单元素有&lt;input&gt;(输入框)、&lt;select&gt;(下拉选择)、&lt;textarea&gt;(多行文本输入)和&lt;button&gt;(按钮)等。例如: ```html &lt;form&gt; &lt;label for="username"&gt;用户名:&lt;/label&gt; ...

    大学投票系统

    ├══════╮&lt;br&gt; ║ ║ 论坛:http://bbs.51aspx.com ║ ║&lt;br&gt; ║ ╰═══════════════╯ ║&lt;br&gt; ║ ║&lt;br&gt; ║51aspx声明: ║&lt;br&gt; ║ 1) 本站不保证所提供软件或程序的完整性和安全性。...

    --JTable的分页显示

    这篇转载的博客文章探讨了如何在`JTable`中实现分页功能。 首先,理解`JTable`的基本结构至关重要。`JTable`是基于`DefaultTableModel`的,它管理表格的数据、列名和行数。为了实现分页,我们需要创建一个自定义的`...

    企业管理系统

    3) 转载本站提供的资源请勿删除本说明文件.&lt;br&gt; 4) 本站提供的程序均为网上搜集,如果该程序涉及或侵害到您&lt;br&gt; 的版权请立即写信通知我们.&lt;br&gt; 5) 本站提供软件只可供研究使用,请在下载24小时内删除, &lt;br&gt; 切勿用于...

    JSP发送邮件实例

    有兴趣的同志们可以试一下、、、&lt;br&gt;&lt;br&gt;环境:XP + JDK +TOMCAT6&lt;br&gt;&lt;br&gt;需要用到两个JAR包:mail.jar 和 activation.jar &lt;br&gt;&lt;br&gt;这两个包,我已经放在该程序的WEB-INF/lib下面。&lt;br&gt;&lt;br&gt;还要设置环境变量,把这两...

    Java软件工程

    &lt;br&gt; 1) 本站不能全部保证所提供资料或文件的完整性和安全性,我们可以跟你调换完整的资料。&lt;br&gt; 2) 请在使用前查毒 (这也是您使用其它网络资源所必须注意的) 。&lt;br&gt; 3) 由本站提供的程序对您的计算机造成严重后果的...

Global site tag (gtag.js) - Google Analytics