什么是幂等HTTP方法的非幂等序列(示例)?

时间:2016-03-20 23:06:54

标签: http

幂等HTTP方法的非幂等HTTP序列的示例是什么?我一直在考虑可能的例子,并试图在互联网上找到它们但我很难理解“非幂等序列”意味着什么 - 尽管我确实理解了幂等(单一)方法是什么。

让我们看看https://www.rfc-editor.org/rfc/rfc2616.pdf

  

但是,有几个请求的序列可能是非幂等的,即使所有方法都在   那个序列是幂等的。 (如果整个序列的单次执行总是产生一个序列,则序列是幂等的   重新执行该序列的全部或部分更改的结果。)例如,如果序列的结果取决于稍后在同一序列中修改的值,则序列是非幂等的。

“结果”到底意味着什么?我读过那个PUT - >在同一资源上的GET序列(TCP / IP指南:综合,插图的因特网协议参考,1349)是非幂等的,因为第二个请求的结果取决于第一个请求的结果。但让我们分析一下:

PUT("mysite.com", "Hello world");
GET("mysite.com", "Hello world");

此操作后网站的状态将包含“Hello World”文本。 好的,现在我们在第一次执行序列之后。现在我们做:

PUT("mysite.com", "Hello world");

网站的状态不会改变。如果在给定资源上应用此方法后,方法的结果应解释为站点的状态,则结果显然与第一次执行整个序列后的结果相同。然而,还应该理解,应用PUT方法的结果是应用该方法之后的站点的内容,并且GET方法的结果是用户接收的响应。如果是这种情况,最后一个操作的结果与初始序列的结果不同,只是因为PUT和GET方法做了不同的事情。但是这种解释导致了进一步的复杂化,我将在本文后面展示。现在,让我们继续:

GET("mysite.com", "Hello world");

该操作的结果与执行初始序列的结果明显相同。

现在,我将解释我上面给出的解释的并发症是什么(或将会是):它基本上意味着实际上任何GET方法的序列都不是幂等的(除非每个GET都要求相同的)资源)。实际上,GET(“mysite.com”,“img1.jpg”)的结果总是与GET(“mysite.com”,“img2.jpg”)不同。它有效地使流水线GET请求变得不可能(RFC2616明确指出“客户端不应该使用非幂等方法或非幂等方法序列来管理请求”)。

然而,在流水线操作中使用幂等方法的事实使我能够对其预期含义做一些有根据的猜测。即:我认为它主要是为了防止HTTP服务器并行处理请求,如果对第n个响应的响应可能取决于之前一个(或多个)请求的影响(RFC2616允许处理)并行请求虽然它声明对收到的请求的响应必须按照收到这些请求的顺序发送)。但如果是这种情况,那么原始定义就是错误的,应该以类似的方式陈述:

“我们假设我们有一个从1到n编号的HTTP方法的序列a_n。让我们说对于{1,2,...,n}方法编号i中的任何i,返回结果R_i。让我们构造一个序列,遵守以下规则:

1)p是任意取的非负自然数,
2)对于每个p w_p属于{a_1,a_2,...,a_n}。

如果对于每个w_p条件:

如果w_p = a_j,那么w_p的结果是R_j

成立,然后我们说序列a_n是幂等的。“

然而,我提出的只是我的假设。
你能告诉我他们是对还是错?

1 个答案:

答案 0 :(得分:0)

我有一个相同的问题,我想指出的是,如果[...] 不能通过重新执行全部或部分的来更改,则序列是幂等的。该顺序。”。

这样的频率定义为: R := { "PUT /test", "DELETE /test", "GET /test" } 如果重新执行请求的子集,可能会产生不同的结果,尽管事实是r ∈ R对于N的副作用与r的相同重新执行相同。