幂等性的含义和 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. OLE剪切板与拖拽

    https://www.xuebuyuan.com/1074399.html https://blog.csdn.net/uda1985/article/details/6179801

  2. EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)

    我们经常在开发过程中,在局部new了一个对象,我们就会在复杂的逻辑过程中担心这个对象是否已经被释放,需要在一大堆的if.else.while.break进行判断new对象是否还存在,或者相同的dele ...

  3. ubuntu 添加新硬盘

    查看硬盘: # fdisk -l ... Disk /dev/sdb: 274.9 GB, 274877906944 bytes 255 heads, 63 sectors/track, 33418 ...

  4. php session在高并发时可能存在的问题。

    如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请求,而不是并行.这是因为在默认情况下,PHP使用文件存储Session数 ...

  5. Laraver 框架资料

    重定向: return redirect()->to('http://www.baidu.com'); 重定向到内部路由 return redirect()->route(‘name’); ...

  6. typedeifn typename

    1.类型说明typedef 类型说明的格式为: typedef  类型 定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型.定义名表示这个类型的新名字. 例如: 用下面语句定义整 ...

  7. 关于Bootstrap table的回调onLoadSuccess()和onPostBody()使用小结

    关于Bootstrap table的回调onLoadSuccess()和onPostBody()使用小结 Bootstrap table 是一款基于 Bootstrap 的 jQuery 表格插件, ...

  8. ①SpringBoot入门教学篇

    一.什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  9. CentOS6安装vsftpd

    练习:完成vsftpd配置 (1) 禁锢系统用户于家目录 [root@node3 ~]# yum -y install vsftpd [root@node3 ~]# vim /etc/vsftpd/v ...

  10. 73个word使用终极技巧

    1.问:Word里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉.文件——页面设置——版式——页眉和页脚——首页不同 2.问:请问Word中怎样让每一章用 ...