幂等性的含义和 HTTP请求方法的幂等性
幂等性的含义和 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请求方法的幂等性的更多相关文章
- Spring MVC 根据请求方法限定:请求方法(四)
请求方法 说明 GET 使用GET方法检索一个表述(representation)——也就是对资源的描述.多次执行同一GET请求,不会对系统造成影响,GET方法具有幂等性[指多个相同请求返回相同的结果 ...
- HTTP请求响应报文&&相关状态码&&GET_POST请求方法 总结
HTTP请求报文: 一个HTTP请求报文由四个部分组成:请求行.请求头部.空行.请求数据 1.请求行 请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.比如 GE ...
- 网络工程 POST与GET请求方法的本质区别
POST与GET请求方法的本质区别: 第一:GET用于信息获取,它是安全的(这里安全的含义是指非修改信息),而POST是用于修改服务器上资源的请求 第二:GET请求的数据会附在URL之后,而POST把 ...
- Ajax请求(二)--JQuery的Ajax请求方法
JQuery库的Ajax请求的几种方法: 1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. 参数含义: url (String ...
- HTTP协议扫盲(二)HTTP协议的请求方法、请求头和响应头
一.HTTP请求方法 Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST ...
- http协议请求方法
解析HTTP协议六种请求方法get.put.post.delete.options和trace含义与区别. 1.GET selecr请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库 ...
- HTTP请求方式中8种请求方法(简单介绍)
简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范.HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的.当我们没有指定端口访问时,浏览器会 ...
- HTTP/1.1标准请求方法和状态码
HTTP/1.1标准自从1999年制定以来至今仍然是一个应用广泛并且通行的标准 相关文档 RFC2616:Hypertext Transfer Protocol -- HTTP/1.1 在RFC658 ...
- http的安全方法和幂等性
最近在研究http,看到http的安全方法和幂等性部分,不太明白,尤其是"post方法是非幂等的"不理解,进过查资料,找到以下两篇有价值的文章,特转过来! 理解HTTP幂等性 转自 ...
随机推荐
- Windows系统下MySQL解压版添加到系统服务
MySQL软件版本:64位 5.7.12 1.首先配置MySQL的环境变量,在系统环境变量Path的开头添加MySQL的bin目录的路径,以“;”结束,我的路径配置如下: 2.修改MySQL根目录下的 ...
- Head First HTML与CSS 学习笔记
1.使用<a>元素创建一个超文本链接,链接到另一个Web页面.<a>元素的内容会成为Web页面中可单击的文本.href属性告诉浏览器链接的目标文件. 2.块元素特立独行,内联元 ...
- Rhel7安装及网卡、yum、vmtools配置和修改主机名
(1)安装Vmware WorkStation 11.0 和 RetHatEnterpriseLinux[RHEL]7.0 步骤就不描述了,网上都可以找到 (2)安装VMware Tools )虚拟机 ...
- Python之xpath
xpath是一种在XML文档中定位元素的语言,常用于xml.html文件解析,比css选择器使用方便XML文件最小构成单元: - element(元素节点) - attribute(属性节点) - t ...
- LeetCode Next Greater Element III
原题链接在这里:https://leetcode.com/problems/next-greater-element-iii/description/ 题目: Given a positive 32- ...
- xcomponent web 跨域组件介绍
1. 项目地址: https://github.com/krakenjs/xcomponent 2. 支持的特性 a. Render an iframe or popup on a different ...
- oracle fn project 开源faas 框架
1. 介绍 Fn is an event-driven, open source, functions-as-a-service compute platform that you can run a ...
- mysql安装问题汇总
操作系统:win7 mysql版本号:mysql 5.5(64位) 1.又一次安装mysql卡在最后一步过不去 问题描写叙述:第一次安装完mysql.使用jdbc写入的中文都是乱码.但已存在于数据库中 ...
- Google搜索被屏蔽,如何使用Google搜索
我们在国内使用搜索引擎最多的是Google和Baidu啦,在引擎上找一些我们需要的知识,最近好像www.google.cn已经无法访问了,并且香港的链接www.google.com.hk也无法访问了, ...
- 安装nagios-plugins插件make时遇到的error
安装nagios-plugins插件make时遇到的error error内容: check_http.c: In function ‘process_arguments’: check_http.c ...