5

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

4

1 回答 1

1

记住给定的 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 结果,它会简单地调用SomeResourcehref 并且会收到适当的 404 或不取决于SomeResource 123现有的。如果PersonURI 不存在,调用它会适当地返回 404,因为它不存在。

于 2012-07-11T13:35:10.543 回答