父资源不再使用时的HTTP状态代码

时间:2018-09-21 07:18:06

标签: rest web web-applications api-design

  

在我们的组织中,我们清单中的项目称为stocks。每个stock都有一个与其关联的sortScore。内部API向组织中的另一个团队公开,以更新stock的sortScore。

放置/ api / stock / {stockid} / sortscore

  

此请求更新库存的sortScore。库存可能不再是live(it is sold),但是由于某些原因,用于更新sortScore的内部API仍然被另一个团队使用。

     

根据我的说法,这里的资源为sortScore,父资源为stock,该资源不再有效(它曾经在某个时间有效)。即使库存不再live,我们仍将其记录保存在数据库中。

     

我们中有些人对stock is not live anymore时发送的HTTP状态代码有争议。由于该资源在预定的Resource Identifier(URL)处不可用,因此我们正在发送找不到” 。但是我们的一些同事说,由于库存曾经在某个时间点被使用过,因此Status Code应该是 2xx系列,并带有消息This stock is not live anymore

     

现在我在这里要知道stackoverflow的人们对正确答案应该怎么看?

2 个答案:

答案 0 :(得分:1)

关于REST的一件重要的事情是,“父资源”和“子资源”的概念并不存在。。

就REST和HTTP而言; /a/b/c不一定与/a/b/a/b/c/d有任何关系。每个资源都是自己的东西,具有自己的表示形式。

所以你应该考虑

PUT /api/stock/{stockid}/sortscore

孤立地

由于您不允许客户端更改资源,因此使用2xx状态代码不是正确的主意。 2xx状态代码不仅会表明请求已成功完成,而且还会鼓励消费者清除其缓存等。

404 Not Found并不是一个正确的主意,因为PUT应该create a resource(如果还没有礼物的话)。

  

PUT方法请求创建目标资源的状态或将其替换为请求消息有效负载中包含的表示形式定义的状态

在我看来,“不再使用”意味着不再允许消费者修改资源状态。这反过来提示您所需的状态代码为405 Method Not Allowed

  

状态代码405(不允许使用方法)指示请求行中接收的方法对于原始服务器是已知的,但目标资源不支持。

答案 1 :(得分:1)

为此的常见状态代码是409 Conflict409 Conflict的想法是,即使您的请求一切正常,服务器的当前状态也会阻止其成功。

您当前的状态是其他资源不再存在。这与您正在执行的PUT请求冲突。