幂等性的含义和 HTTP请求方法的幂等性


1、什么是幂等性

===============

幂等性,英文是idempotent,读作[aɪ'dɛmpətənt]。

它的含义如下:

“Methods can also have the property of "idempotence" in that the side-effects of N > 0 identical requests is the same as for a single request.”(这句话翻译过来是这样的:方法可以有幂等性,幂等性指的是N>0次的完全相同的请求的副作用和一次单个请求的副作用是相同的)。

即,如果一个方法重复执行多次,产生的效果是一样的,那么这个方法就是幂等的。

2、HTTP请求方法的幂等性

=====================

方法名 作用 安全性 幂等性
DELETE 删除资源,幂等操作
POST 新增资源,非幂等操作
GET 查询资源,幂等操作
PUT  更新资源,幂等操作
PATCH 更新资源,非幂等操作
HEAD  类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
OPTIONS  用于客户端查看服务器的性能

3、请求方法的语义辨析

===================

3.1 put和post的区别

------------------------------

有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源;有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源;还有的观点认为可以用PUT和POST中任何一个来做创建或者更新一个资源。这些观点都只看到了风格,争论起来也只是争论哪种风格更好,其实,用PUT还是POST,不是看这是创建还是更新资源的动作,这不是风格的问题,而是语义的问题。

在HTTP中,PUT被定义为idempotent的方法,而POST则不是幂等的,这是一个它们在语义上的最重要的区别。

举一个例子,假如有一个博客系统提供一个Restful API,模式是这样http://superblogging/blogs/{blog-name}。当往这个URI发送一个HTTP PUT或者POST请求时,博文会存放在http request body部分发送给服务器端。

此时,这个请求应该用PUT方法还是POST方法呢?这取决于这个REST服务的行为是否是幂等的。

假如客户端发送两个http://superblogging/blogs/Sample请求,服务器端产生了两个文章内容一样的博客,那就说明这个服务不是幂等的,因为多次调用产生了多个结果,而不是多次调用只产生一个结果。

如果第二个请求把第一个请求给覆盖掉了,那这个服务就是幂等的。

前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。

3.2 为什么patch是非幂等的

-------------------------------------

PUT方法的实体无结构的,它直接把实体部分的数据替换到服务器的资源上。而PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的数据。也就是说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响,这就可以解释它为什么是不幂等的了。

举个例子,如果服务器上有个资源/abc.int,里面存放一个整数,值为 1。当GET这个资源的时候,服务器响应的实体只包含了 1 这个数字。现在在自己的框架中定义当提交PATCH请求,实体匹配^\+\d+$的格式时就对服务器资源中的数字执行一个加法操作。于是当客户端向/abc.int地址发起PATCH请求,实体部分为+3之后,服务器的/abc.int资源中的数据就变成 4,也就是说,GET它会得到 4。如果客户端不小心重复提交了PATCH请求,那么+3就会被再执行一次,这个资源的数据就变成 7。从这个例子可以看出,PATCH请求会对资源进行修改,请求一次修改一次,多次请求多次修改,每次修改之后资源的状态都会改变,这就是为什么说PATCH方法是非幂等的了。

参考资料

1、http://www.cnblogs.com/jinks/p/3511282.html      http请求方法的安全性和幂等性

2、http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html     http协议的说明

3、http://www.jianshu.com/p/178da1e2903c

幂等性的含义和 HTTP请求方法的幂等性的更多相关文章

  1. Spring MVC 根据请求方法限定:请求方法(四)

    请求方法 说明 GET 使用GET方法检索一个表述(representation)——也就是对资源的描述.多次执行同一GET请求,不会对系统造成影响,GET方法具有幂等性[指多个相同请求返回相同的结果 ...

  2. HTTP请求响应报文&&相关状态码&&GET_POST请求方法 总结

    HTTP请求报文: 一个HTTP请求报文由四个部分组成:请求行.请求头部.空行.请求数据 1.请求行   请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.比如 GE ...

  3. 网络工程 POST与GET请求方法的本质区别

    POST与GET请求方法的本质区别: 第一:GET用于信息获取,它是安全的(这里安全的含义是指非修改信息),而POST是用于修改服务器上资源的请求 第二:GET请求的数据会附在URL之后,而POST把 ...

  4. Ajax请求(二)--JQuery的Ajax请求方法

    JQuery库的Ajax请求的几种方法: 1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. 参数含义: url (String ...

  5. HTTP协议扫盲(二)HTTP协议的请求方法、请求头和响应头

    一.HTTP请求方法 Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST ...

  6. http协议请求方法

    解析HTTP协议六种请求方法get.put.post.delete.options和trace含义与区别. 1.GET   selecr请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库 ...

  7. HTTP请求方式中8种请求方法(简单介绍)

    简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范.HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的.当我们没有指定端口访问时,浏览器会 ...

  8. HTTP/1.1标准请求方法和状态码

    HTTP/1.1标准自从1999年制定以来至今仍然是一个应用广泛并且通行的标准 相关文档 RFC2616:Hypertext Transfer Protocol -- HTTP/1.1 在RFC658 ...

  9. http的安全方法和幂等性

    最近在研究http,看到http的安全方法和幂等性部分,不太明白,尤其是"post方法是非幂等的"不理解,进过查资料,找到以下两篇有价值的文章,特转过来! 理解HTTP幂等性 转自 ...

随机推荐

  1. CSS:Tutorial one

    1.Three Ways to Insert CSS External style sheet Internal style sheet Inline style External Style She ...

  2. css3 伪类

    ::selection { 选中后的样式 } 链接 p:only-child     p的父级只有一个p标签 p:only-of-type   p的父级有一个p标签, 但还可以包含其他标签 p:fis ...

  3. Redis 补充

    Redis 补充 Redis 的主要用途 数据库 缓存和消息中间件 相当于一个字典 数据库切换 select 1 (默认36个数据库 默认在0) 1 基本数据类型 字符串 散列 hashes 列表 集 ...

  4. Activity的生命周期,BACK键和HOME对生命周期的影响

    下面这张图详细的描述了Activity的整个生命周期: 直接上代码,注意看注释: [java] view plaincopy public class HelloActivity extends Ac ...

  5. mysql数据库( 基础篇加破解)

    1.数据库(Database,DB)是按照数据结构来组织.存储和管理数据的,并且是建立在计算机存储设备上的仓库 2.什么是数据库:(用来存储数据的仓库) 数据库:(cs架构套接字) 数据库管理软件分类 ...

  6. Pipeline处理Dataflow

    Pipeline处理Dataflow https://www.cnblogs.com/CoderAyu/p/9757389.html .Net Core中利用TPL(任务并行库)构建Pipeline处 ...

  7. 在IIS站点中使用数字证书

    1. SSL解析(内容来自百度百科) SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安 ...

  8. 转载FPGA学习之内嵌乘法器调用

    补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别 ...

  9. BZOJ3214 [Zjoi2013]丽洁体

    题意 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其它题 ...

  10. Spring Aware接口---BeanNameAware BeanFactoryAware ApplicationContextAware

    前言 对于应用程序来说,应该尽量减少对spring api的耦合程度,然后有时候为了运用spring提供的一些功能,有必要让bean了解spring容器对其管理的细节信息,如让bean知道在容器中是以 ...