null 或缺少对象属性的适当 HTTP 状态代码是什么?

What is the appropriate HTTP status code for a null or missing object attribute?

假设我们有一个 API,其路由 /foo/<id> 表示这样一个对象的实例:

class Foo:
    bar: Optional[Bar]
    name: str
    ...

class Bar:
    ...

(Python中的示例只是为了方便,这是关于 HTTP 层而不是应用程序逻辑。)

我们想在/foo/<id>下暴露全序列化的Foo个实例(可能有很多其他属性),但是为了效率,我们也想暴露/foo/<id>/bar给我们 只是 给定 Foo.

.bar 属性

bar 在这里是 None 时,使用 404 作为状态响应对我来说感觉很奇怪,因为如果你任意请求一些状态代码,你会得到相同的状态代码也不正确的路线,例如 /random/gibberish;如果我们要在我们的客户端层自动处理 404 状态,它可能会用诸如“我们忘记登录”或“客户端 URL 路由错误”等可能的解释来误解它。

然而,200 的响应主体为 null(如果我们使用 JSON 进行序列化)也感觉很奇怪,因为实体的存在或不存在给定的端点通常通过状态而不是在正文中进行通信。带有 empty 响应主体的 204 是正确的说法吗? 404 是正确的方法吗?如果是这样,服务器传达细微差别的正确方法是什么,例如“但这是完全预期且正确的路线”或“实际上您指定的 foo-ID 不正确,这并没有丢失,因为该属性未设置。

以不同方式表示该属性缺失的优缺点是什么?

404https://developer.mozilla.com表示,

In an API, this can also mean that the endpoint is valid but the resource itself does not exist.

所以我觉得可以接受。 204 在这种情况下并没有让我觉得特别古怪,但更常见的是(至少 IME)与 DELETEs(偶尔 PUTs/POST没有 return 结果。)

我想知道您能否更清楚地阐明为什么 200null 响应主体很奇怪。我认为它传达的正是你想要的,只要你不试图区分给定的 Foo 没有 bar(例如 Foo.has_key?(bar))和 Foobar 明确设置为 null.

我也为此苦苦挣扎,因为:

  1. 404可以指向一个不存在的url,或者一个可以接受的路径 但特定引用的资源不存在。我也有 用它来根据请求 body 的错误输出 不存在。

  2. 很多人shoe-horn这些错误变成了bad request(400) 错误代码在某种程度上是可以接受的,但也是一种逃避。 (从字面上看,服务器未成功处理的任何内容都可以归类为错误请求,如果您 想一想)

  3. 考虑到 2(以上),带有一些有用信息的 400 body 是 有时用来洗刷没有完全承诺的罪恶感 404,但这需要对客户端的一些解析期望 一面,这并不总是很好。还返回一个 400,其中, 根据 this 的说法,这有点刺激客户,因为 400 就请求的结构而言,错误应该完全是客户端的错,而不是因为客户端要求的东西不在您的数据库中。

400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

  1. 总的感觉是200表示一切都好,因此 总是有一个默认的期望,响应总是包含 某种形式的 body,而不是 null。(对吗??)我不鼓励使用 200 这些情况。虽然 204 不承担必须进行响应的责任 body,但它们也在某种程度上传达了“某事有效”的信息,这不是您想在这里发送的信息,对吧?

我想表达什么?周到API设计很难。