假设我有一个资源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
确实存在但嵌套资源丢失了。
答案 0 :(得分:1)
记住给定的URI旨在识别单个“资源”可能会有所帮助。从语义上讲,URI结构不支持“嵌套”资源的概念。您似乎有两种资源:Person
&在SomeResource
与[{1}}有某种关系的场景中SomeResource
。您可以尝试这样的结构来表示这种关系:
Person
这样你就不会超载400& 404具有应用特定含义。如果客户端收到了有效的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...
}
href,并根据现有的SomeResource
收到相应的404。如果SomeResource 123
URI不存在,则调用它将适当地返回404,因为它不存在。