RESTful API中GET动词的幂等性

时间:2018-03-21 09:58:12

标签: rest get idempotent

正如这里提到的https://restfulapi.net/http-methods/(以及其他地方):

  

GET API应该是幂等的,这意味着制作多个   相同的请求必须每次产生相同的结果直到另一个   API(POST或PUT)已更改服务器上的资源状态。

如何在返回时间的API中使其成为现实?或返回受时间影响的数据。

换句话说,每次使用GET http://ip:port/get-time-now/时,它都会返回不同的响应。但是,我没有在两个有序的POST之间发送PUTGET's

这是否会导致上一个声明错误?我误解了什么吗?

1 个答案:

答案 0 :(得分:1)

幂等性是对客户/中介的承诺,即在网络出现故障等情况下可以重新发布请求而无需进一步考虑,而不是数据永远不会改变。

例如,如果您发出POST请求,如果网络出现故障,您不知道之前的请求是否到达服务器但中途的响应是否丢失或初始请求是否均匀到达服务器。如果您重新发出请求,则可能实际创建了另一个资源,因此POST不是幂等的。另一方的PUT具有合同,它将当前表示替换为请求中包含的表示。如果您发送两次相同的请求,则在处理完两个PUT请求之后,资源的内容应该相同。请注意,实际结果仍然可能不同,因为服务可以自由地将接收的实体修改为相应的表示。此外,在通过PUT发送数据并通过GET检索数据之间,另一个客户可能已经更新了两者之间的状态,因此无法保证您实际上会收到您确切的表示形式。发送到服务。

Saftiness是另一个承诺,只有GETHEADOPTIONS支持。它承诺调用者它根本不会修改任何状态,因此客户/中介在发出此类请求时是安全的,而不必担心它会修改任何状态。实际上,对于盲人调用任何URL以便学习其内容的爬虫来说,这是一个重要的承诺。在违反这种承诺的情况下,即通过在处理GET请求时删除数据,唯一应该责备的是服务实现者而不是调用者。如果爬虫调用此类URL并因此删除某些数据,则实际上不是爬虫故障而只是服务实现者。

由于您的响应中有动态值,您可能希望阻止响应的缓存,否则中间人可能会为您的资源返回旧状态