rest - 找不到时如何处理 Web API ("REST") 中的嵌套资源?

标签 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确实存在,但缺少嵌套资源。

最佳答案

记住给定的 URI 旨在识别单个“资源”可能会有所帮助。从语义上讲,URI 结构不支持“嵌套”资源的概念。看来你有两个资源:Person & SomeResource在您的场景中 SomeResourcePerson 有某种关系.您可以尝试使用这样的结构来表示这种关系:

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/

相关文章:

java - 创建 JAX-RS 提供程序以从 InputStream 创建 Java Image

javascript - 如何从 html 表单中获取输入值并转换为 csv?

php数据库注册并接受

mysql - 为什么我应该对关联表使用主 ID

c# Web Api - 所有 api 响应的通用包装器类

breeze - 使用breezejs和Web API处理计算的属性

java - 将数据库异常信息传输给客户端的最佳实践

javascript - 在 Post API 调用正文中动态传递参数

java - 如何使用 Spring Boot 在 REST Web 服务中的 GET 请求期间修复 'HTTP-404' 错误

c# - 将 Base64 编码的 CSS 图片上传到 Asp.Net MVC/Web Api