@MichaelBurr 关于幂等性和副作用是正确的。
我的观点是,给定的 REST 请求涉及两种状态,即客户端状态和服务器状态。REST 就是在服务器和客户端之间传输这些状态,以便客户端的状态映射到服务器状态的子集,换句话说,子集与服务器保持一致。因为这种幂等性应该意味着后续的幂等请求不会导致任何一个状态与仅发出一次请求不同。使用第一个 DELETE,您可以想象服务器删除资源并让客户端知道它也可以删除资源(因为资源“不再存在”)。现在这两个状态应该与之前相同,减去已删除的项目。为了让客户端在尝试删除已删除的项目时做任何不同的事情,那么从服务器传输到客户端的状态必须包含不同的信息。服务器可以对资源已经被删除的信息做一些稍微不同的事情,但是一旦它用不同的东西做出响应,方法的幂等性就基本上被破坏了。
对于幂等函数:
delete(client_state) -> client_state - {item}
delete(delete(client_state)) -> client_state - {item}
delete(client_state) = delete(delete(client_state))
保证这种幂等性的最好方法是如果服务器的响应是相同的,这意味着客户端状态打破幂等性的唯一方法是在客户端处理响应时存在不确定性或副作用(这可能指向处理响应的错误实现)。
如果客户端和服务器之间就状态代码存在于正在传输的状态表示(REST)之外的协议达成一致,则可以通知客户端该项目“不再存在”(因为它会在第一个请求中)以及先前已删除的额外评论。客户端如何处理这些信息尚不清楚,但它不应该影响生成的客户端状态。但是状态码不能用于传达状态,或者更确切地说,如果它在其他情况下也传达状态(例如“您无权删除此项目”或“项目未删除”),那么有一些引入歧义或混乱。所以,并且仍然让服务器的响应取决于先前相同的 DELETE 请求。
HTTP 请求涉及删除方法,因此该函数可能类似于
delete(client_state) = send_delete(client_state) -> receive_delete(client_state)
-> respond_to_delete(informative_state)
-> handle_response(informative_state)
-> client_state - {item}