我有两条路径:
/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
,但是我不确定。
在这种情况下最好的方法是什么?
答案 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有一个有用的决策树,用于处理有关状态码的问题。