如果TCP / IP是一个可以代表我们重试请求的可靠协议,为什么我们需要HTTP GET,PUT或DELETE才是幂等的?
答案 0 :(得分:4)
TCP / IP不会重试请求,如有必要,它会重新传输构成每个请求的原始数据包。
如果请求失败(在HTTP层),客户端的工作就是重试它,而不是网络堆栈。
特别是,如果客户端(出于任何原因)未能收到指示RESTful操作是否成功的响应代码,则客户端必须能够重新发送相同的操作,而不必担心任何意外的副作用。
这些故障可能发生 - 中间防火墙可能在服务器处理操作时超时连接。一旦收到它必须继续执行的请求,服务器就不会知道这已经发生了。
答案 1 :(得分:2)
您似乎在HTTP协议级别上将Idempotency与TCP级别的字节流可靠性混淆。
Idempotent (wikipedia)表示发送10次相同的HTTP请求与执行一次相同的效果。
如果丢失TCP流中的数据包,将重新传输。但应用程序协议(HTTP)并不知道TCP必须重新传输数据包。
即使包含完整HTTP请求的单个数据包被TCP重新传输10次,浏览器/服务器也只会看到一个HTTP请求。 TCP重新发送的原因是数据包丢失,但应用程序协议(如HTTP)不知道TCP必须重新传输。无论有无丢包,它们似乎都是相同的请求
答案 2 :(得分:2)
HTTP的GET,PUT和DELETE是幂等的,因为在某些网络故障模式下,客户端无法知道请求是完成还是完整。
例如,如果客户端请求资源的DELETE,但服务器在客户端收到完整响应之前关闭连接,则客户端不知道资源是否已删除。然后客户端陷入两难境地:操作可能失败,在这种情况下应该重新发送DELETE以便将应用程序推进到所需的状态。但也许它成功了;如果我重试,会发送相同的DELETE请求吗?也许它会起作用。也许它会返回500错误(这只会增加客户的困惑)。也许它适用于不同的资源!幂等性要求允许客户确信他们可以重试请求并使其工作。这并不意味着你会得到完全相同的反应;第一个请求可能会收到200 OK而第二个404 Not Found或410 Gone。但是客户不必担心重试会产生意外的副作用。