尝试添加子资源时正确的HTTP代码,但是没有父资源

时间:2018-12-14 18:31:25

标签: rest http

我有两条路径:

  • /students
  • /students/{id}/addresses

..具有以下行为:

  • POST/students-201 Created(如果成功创建了学生)
  • POST/students/{id}/addresses-201 Created(如果在请求的学生下成功创建了地址)

现在,想象一下我从POST/students/7/addresses的情况,但是Student中没有id = 7。 在这种情况下正确的HTTP代码是什么?

首先,我认为应该是404,并且响应正文描述Student中没有id = 7,但是我不确定。

在这种情况下最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

HTTP并不真正了解层次结构。没有父资源和子资源的概念。我们(作为API开发人员)添加了这个概念。

但是,有另一种方法来考虑此问题。您是说如果资源B不存在,则无法创建资源A。

为此的常见状态代码是409 Conflict。冲突表明,虽然请求本身是有效的,但另一资源的状态阻止了该请求的成功。如果其他资源的状态发生变化(您创建了学生资源),则初始请求将起作用。

答案 1 :(得分:1)

  

现在,想象一下我发布到/ students / 7 / addresses的情况,但是没有id = 7的Student。在这种情况下正确的HTTP代码是什么?

在这种情况下,我希望看到使用404。

Evert所述,目标的“子资源”性质是红色鲱鱼;就HTTP而言,拼写/students/7/students/7/addresses没有暗示任何关系。它们是不同的资源。

(在这一点上有些困惑,因为RFC 3986在对path segments的讨论中讨论了“层次结构”,但这实际上是关于分辨率机制以及dot segments在相对分辨率下的工作方式。我们可以选择使标识符层次结构与路径段对齐,但是HTTP并不要求这样做,并且通用组件也不允许这样做。)

因此,需要单独理解对/students/7/addresses的POST。 HTTP的语义与键值存储的语义非常相似-请求的目标uri是使您可以访问表示形式的键。

在您的特定情况下,您具有一个密钥,该密钥引用了商店中当前不存在的资源。在我看来,这听起来像是404 Not Found

  

404(未找到)状态代码表示原始服务器未找到目标资源的当前表示,或不愿意透露该资源的存在。

响应的正文通常会包含有关所发生情况的其他信息,但我们可能希望通用HTTP组件将其视为URL的拼写错误。

Michael Kropat的Stop Making It Hard有一个有用的决策树,用于处理有关状态码的问题。