如何找不到Web API(“REST”)中的嵌套资源?

时间:2012-07-11 10:34:39

标签: rest web asp.net-web-api

假设我有一个资源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确实存在但嵌套资源丢失了。

1 个答案:

答案 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,因为它不存在。