Rest 什么';从HTTP DELETE的角度看幂等性的正确方法是什么?

Rest 什么';从HTTP DELETE的角度看幂等性的正确方法是什么?,rest,http,idempotent,Rest,Http,Idempotent,我最近花了很多时间阅读HTTP 1.1规范,并将其与REST联系起来。我发现,关于HTTP DELETE方法的“幂等性”和安全性,有两种解释。以下是两个阵营: 如果您使用HTTP delete删除一个资源,并且成功(200 OK),然后您尝试删除该资源N次,那么您应该为每个删除调用返回一条成功消息(200 OK)。这就是它的“幂等性” 如果您使用HTTP delete删除一个资源,并且删除成功(200确定),然后再次尝试删除该资源,您应该会收到一条错误消息(410消失),因为该资源已被删除 规范

我最近花了很多时间阅读HTTP 1.1规范,并将其与REST联系起来。我发现,关于HTTP DELETE方法的“幂等性”和安全性,有两种解释。以下是两个阵营:

  • 如果您使用HTTP delete删除一个资源,并且成功(200 OK),然后您尝试删除该资源N次,那么您应该为每个删除调用返回一条成功消息(200 OK)。这就是它的“幂等性”

  • 如果您使用HTTP delete删除一个资源,并且删除成功(200确定),然后再次尝试删除该资源,您应该会收到一条错误消息(410消失),因为该资源已被删除

  • 规范说DELETE是幂等的,当然,但它也说幂等事件的序列仍然会产生副作用。我真的觉得第二个阵营是正确的,而第一个阵营是误导性的。通过允许客户端认为他们是删除以前删除的资源的原因,我们引入了什么“安全性”


    第一阵营中有很多人,包括几位关于这个主题的作者,所以我想检查一下,除了情绪之外,是否有其他令人信服的原因导致人们进入第一阵营。

    幂等并不意味着请求不允许有副作用(这就是“安全”属性所描述的)。这仅仅意味着多次发出相同的请求不会产生不同的或额外的副作用


    在我看来,后续的删除请求应该返回一个错误——它仍然是幂等的,因为服务器的状态与仅发出一个删除请求时的状态相同。然后再次返回200 OK状态也应该是OK的-我不认为幂等性要求为后续的删除请求返回错误代码-只是返回错误状态对我来说更有意义。

    @MichaelBurr关于幂等性和副作用是正确的

    我的观点是,在给定的REST请求中有两种状态:客户端状态和服务器状态。REST就是在服务器和客户机之间传输这些状态,这样客户机的状态映射到服务器状态的子集,换句话说,子集与服务器保持一致。正因为如此,幂等性应该意味着后续的幂等请求不会导致任何一种状态与只发出一次请求不同。在第一次删除时,您可以想象服务器删除了资源,并让客户端知道它也可以删除资源(因为资源“不再存在”)。现在,这两个状态应该与之前相同,并减去已删除的项。如果客户端在删除项目后尝试删除该项目时要执行任何不同的操作,则从服务器传输到客户端的状态必须包含不同的信息。服务器可以使用资源已经被删除的信息做一些稍微不同的事情,但是一旦它以不同的方式响应,方法的幂等性就基本上被破坏了

    对于幂等函数:

    delete(client_state) -> client_state - {item}
    delete(delete(client_state)) -> client_state - {item}
    delete(client_state) = delete(delete(client_state))
    
    保证这种幂等性的最佳方法是如果服务器的响应相同,这意味着客户端状态打破幂等性的唯一方法是客户端处理响应时存在不确定性或副作用(这可能表明处理响应的实现不正确)

    如果客户机和服务器之间达成协议,认为状态代码存在于正在传输的状态(REST)的表示之外,则可以通知客户机该项“不再存在”(与第一个请求中的情况相同),并附加先前已删除的注释。客户机如何处理这些信息尚不清楚,但不应影响结果客户机状态。但是,状态代码不能用于传达状态,或者更确切地说,如果它在其他情况下也传达状态(例如“您没有删除此项目的权限”或“项目未被删除”),则会引入一些歧义或混淆。因此,如果您想说DELETE是幂等的,并且服务器的响应仍然依赖于之前相同的DELETE请求,那么您至少需要一个很好的理由来在通信中引入更多的混乱

    HTTP请求涉及remove方法,因此函数可能类似于

    delete(client_state) = send_delete(client_state) -> receive_delete(client_state) 
                                                     -> respond_to_delete(informative_state) 
                                                     -> handle_response(informative_state) 
                                                     -> client_state - {item} 
    
    将幂等定义为一个操作,该操作:

    可以多次应用,而不会改变初始应用以外的结果

    请注意,它们讨论操作的
    结果。对我来说,这包括服务器状态和响应代码

    HTTP规范在这个问题上有点模糊。它指定HTTP方法是幂等的:

    如果多个相同请求的预期效果与单个请求相同

    如果你在维基百科的定义中将
    effect
    解释为
    result
    ,那么它们的意思是相同的。在任何情况下,我都怀疑告诉客户资源已经被删除的实际好处

    最后一点:幂等性是根据单个客户机定义的。一旦您开始引入其他客户机的并发请求,所有的赌注都没有了。您应该使用条件更新头(如
    If Match ETag
    )来处理此类情况


    重申:您应该返回相同的返回代码,无论该资源是刚刚被删除、被以前的请求删除还是根本不存在。

    我也有相同的意见,我很高兴看到其他人共享它。我想我只是想听听。谢谢我得辞职了