幂等性(Idempotency):(分布式系统的特性)幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同,
定义如下:
单目运算, x为某集合内的任意数, f为运算子如果满足f(x)=f(f(x)), 那么我们称f运算为具有幂等性(idempotent)
比如在实数集中,绝对值运算就是一个例子: abs(a)=abs(abs(a))
双目运算,x为某集合内的任意数, f为运算子如果满足f(x,x)=x, f运算的前提是两个参数都同为x, 那么我们也称f运算为具有幂等性
比如在实数集中,求两个数的最大值的函数: max(x,x) = x, 还有布尔代数中,逻辑运算 "与", "或" 也都是幂等运算, 因为他们符合AND(0,0) = 0, AND(1,1) = 1, OR(0,0) = 0, OR(1,1) = 1。
在计算机中,我们可以通过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和PUT是这样定义的:
The POST method isused to request that the origin server accept the entity enclosed in therequest as a new subordinate of the resource identified by the Request-URI inthe Request-Line ...... If a resource has been created on the origin server,the response SHOULD be 201 (Created) and contain an entity which describes thestatus of the request and refers to the new resource, and a Location header.
The PUT methodrequests that the enclosed entity be stored under the supplied Request-URI. Ifthe Request-URI refers to an already existing resource, the enclosed entitySHOULD be considered as a modified version of the one residing on the originserver. If the Request-URI does not point to an existing resource, and that URIis capable of being defined as a new resource by the requesting user agent, theorigin server can create the resource with that URI.
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方法具有幂等性。
For instance:比如浏览一个博客,无论浏览多少次,都不会读这个博客造成影响,也许会说增加了访问量,但是这个不是因为你浏览帖子造成的,造成改变的是该博客本身的逻辑设计,也许你会说,这个博客内容让更新或者删除了,得到的浏览结果不一样了,得到的是一样的,里面的内容不是因为你的操作造成的,而是因为博主或者其他原因。
基于幂等性处理的问题:取钱问题,进而引入发帖问题。
Post vs Put
Post:创建,不安全,不幂等
Put:更新或创建,幂等
About creat:POST 是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
Post:Use POST to create resources when you do not know the resourceidentifier. With POST creates, it is best practice to return the status of “201Created” and the location of the newly created resource, since its location wasunknown at the time of submission. Thisallows the client to access the new resource later if they need to.
Put:Use PUT when you allow the client to specify the resourceidentifier of the newly created resource. But remember, since PUT is idempotent, you must send all possiblevalues.
About update:
You can use POST to send either allavailable values or just a subset of available values;
If you want to use PUT to update aresource, it must be a full resource update; you MUST send all attribute valuesin a PUT request to guarantee idempotency. Use PUT when you want or need to send all available values in order tofollow idempotency requirements, for instance in the case of a full resourceupdate.
You can also use POST to send all valuesas well and the server state could be the same as a full PUT – it’s just notrequired to be by the HTTP specification. Note that idempotency has a strong correlationto being cacheable by HTTP caching servers, and therefore POST requests aregenerally not cached. If you are ok with this caching side effect, you can usePOST for both full and partial updates.
相关推荐
在本文中,我们将深入探讨如何使用VC++实现HTTP的基本操作,包括POST、GET、PUT和DELETE,以及如何处理代理设置、读取HTTP头信息和解析HTML文档中的特定标签属性值。这些功能对于开发RESTful API客户端或者进行网络...
详解http的put delete get post
HTTP中的POST和GET方法是两种最常用于网页开发的数据传输方式,它们在原理和表现形式上存在本质区别。 首先,从原理上看,GET方法通常用于获取资源信息,它通过URL来传递参数,URL全称为资源描述符,表示网络上的一...
在标题“HTTPS支持PUT GET POST请求”中,主要涉及的是HTTPS协议对HTTP中三种主要请求方法的支持。 1. **GET请求**:这是HTTP中最常见的请求方法,用于从服务器获取资源。用户在浏览器地址栏输入URL,浏览器就会...
本篇将详细解释如何使用Java发送PUT、DELETE、POST和GET这四种主要的HTTP请求。 PUT请求常用于更新已有资源,它的特点是替换目标URL指定的整个资源。在Java中,可以使用HttpURLConnection或Apache HttpClient库来...
本教程将详细介绍如何在UniApp中封装request网络请求,包括GET、POST、PUT和DELETE四种常见的HTTP方法。 首先,我们需要了解HTTP协议中的这四种方法: 1. GET:获取资源,是最常用的方法,用于从服务器上获取特定的...
本文将深入探讨一个通用的HTTP接口调试工具,该工具支持GET、POST、PUT、PATCH和DELETE等常见HTTP请求方法,并且专注于处理JSON格式的数据。这将帮助开发者在开发和测试过程中更加高效地进行接口调用与验证。 首先...
Django 中request.get和request.post的区别 POST和GET差异: POST和GET是HTTP协议定义的与服务器交互的方法。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。另外,还有PUT和DELETE方法。 POST和GET都...
在 HTTP 中,定义了多种方法来与服务器进行交互,今天我们来详细讲解 GET、POST、DELETE、PUT 等方法的用法。 OPTIONS 方法 OPTIONS 方法用于返回服务器针对特定资源所支持的 HTTP 请求方法。这个方法可以让客户端...
例如,`HttpGet`的构造函数接受一个URI,`setEntity`方法在`HttpPost`和`HttpPut`中用于设置请求体。 **工具使用** HttpClient作为一个强大的工具,可以方便地集成到任何Java项目中。它提供了丰富的API来处理各种...
在这个服务中,提到了四个主要的HTTP方法:POST、DELETE、PUT和GET,这些方法分别对应于创建、删除、更新和查询资源的操作。 1. **POST** 方法:在RESTful API中,POST方法常用于创建新的资源。客户端发送一个POST...
在本文中,我们将深入探讨 HTTP 请求方法的差异,包括 GET、POST、PUT 等请求方法的特点和应用场景。 HTTP 请求方法概述 HTTP 请求方法是指客户端向服务器端发送的请求,以获取或修改服务器上的资源。常见的 HTTP ...
Qt http同步请求测试(restfull中常用的get/post/put/delete、文件上传/下载) 示例源码 https://blog.csdn.net/aggs1990/article/details/124104548 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下
它涵盖了HTTP协议中常见的四种请求方法:POST(用于提交数据)、GET(用于获取资源)、PUT(用于更新资源)和DELETE(用于删除资源)。这样的工具对于开发者来说非常有用,可以在实际开发或调试过程中快速验证接口的...
本实例将详细讲解如何在C#环境中实现HTTP POST请求,以实现数据的发送和接收。 HTTP POST方法是HTTP协议中的一个请求类型,它允许客户端向服务器发送数据,常用于提交表单或上传文件。在C#中,我们可以使用多种方式...
在本压缩包"webapi2"中,我们可以预见到一些用于测试WebAPI核心功能——GET、POST、PUT和DELETE方法的代码。 GET方法常用于从服务器获取资源。在WebAPI中,GET请求通常映射到控制器中的一个无参数的方法。例如,`...
测试接口,模拟POST,GET,PUT,DELETE提交的工具
HttpClient库允许我们构建灵活、高效的HTTP客户端,支持多种请求方法,包括GET、POST和PUT。这些方法在Web服务调用、数据传输和API交互中非常常见。以下是对每个方法的简要介绍: 1. **GET**:GET是最常见的HTTP...