非幂等HTTP方法序列的例子有哪些?

3
什么是非幂等HTTP方法的序列示例?我一直在思考可能的示例,也试图在互联网上找到示例,但我实在不太明白“非幂等序列”的含义 - 尽管我确实知道什么是幂等(单个)方法。

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

然而,即使在执行该序列中的所有方法都是幂等的情况下,仍然可能存在几个请求的序列是非幂等的。(如果整个序列的单次执行总是产生一个由全部或部分重新执行的结果不会改变的结果,则该序列是幂等的。)例如,如果其结果取决于在同一序列中后来修改的值,则序列是非幂等的。

这里的“结果”具体指什么?我读到PUT-> GET序列(TCP/IP指南:综合,插图化的Internet协议参考,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。按照以下规则构建序列w_p:

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个回答

1
我有同样的问题,我认为重点在于“如果一个序列在全部或部分重新执行后没有被改变,则该序列是幂等的。”。因此,由以下序列定义: R:= {“PUT /test”,“DELETE /test”,“GET /test”} 如果重新执行请求的子集,则可能会产生不同的结果,尽管对于每个请求r ∈ R,将有rN次相同重新执行的副作用相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接