假设我有一个资源 Person
在一个人身上,我有一个嵌套资源 SomeResource
.在以下场景中应该返回哪个状态代码,为什么?
/Person/1/SomeResource (SomeResource does not exist)
/Person/1/SomeResource (Person does not exist)
我认为 404 应该在两种情况下都使用,但不是每个人都同意,我想知道为什么。你可以争辩说
Person
是底层资源和SomeResource
只是该资源的“属性”和对 SomeResource
的请求因此,在第一种情况下应该什么都不返回,而在第二种情况下应该返回 404。我认为这可能是一种选择,但我仍然更喜欢 404。我根本不喜欢的另一种情况是返回 500 并带有错误描述,这也是我在讨论中听到的另一种选择,但这迫使消费者针对我不喜欢的异常进行编程。 500 对我来说意味着出了点问题,你真的无能为力。问题是,争论是如果你得到了它,你不知道为什么会得到 404,是不是因为
Person
不存在或正因如此 SomeResource
不存在。更新 1:
也许我应该爆发
SomeResource
到一个单独的资源,如/SomeResource/1
返回类似
{data: {the data}, person: {person data}}
的响应,如果两者都丢失,则仅返回 404,但如果数据丢失,则返回 200 并带有空数据。更新 2:
我想我想出了要使用哪个状态代码,当这个人不存在时它是 400,因为那时我认为这是一个你不应该做的请求,也就是说,一个错误的请求。当
SomeResource
缺少我会选择 404,因为 Person
确实存在,但缺少嵌套资源。
最佳答案
记住给定的 URI 旨在识别单个“资源”可能会有所帮助。从语义上讲,URI 结构不支持“嵌套”资源的概念。看来你有两个资源:Person
& SomeResource
在您的场景中 SomeResource
与 Person
有某种关系.您可以尝试使用这样的结构来表示这种关系:
GET /person/1
{
name: "Some Value",
someResource: {
"Href": "http://yourSite.com/someresource/123",
"Title": "Get some resource for this specific person"
},
// other key/value pairs as appropriate...
}
这样您就不会因应用程序特定的含义而使 400 和 404 过载。如果客户端收到了有效的 Person 结果,它会简单地调用
SomeResource
href 并会收到适当的 404 或不取决于 SomeResource 123
现存的。如果Person
URI 不存在,调用它会适本地返回 404,因为它不存在。
关于rest - 找不到时如何处理 Web API ("REST") 中的嵌套资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11430778/