gpt4 book ai didi

缺少父资源的 REST HTTP 响应代码

转载 作者:可可西里 更新时间:2023-11-01 15:13:27 26 4
gpt4 key购买 nike

我的问题是,当父资源或更高级别的资源不存在/已被删除时,我是否应该返回 400 Bad Request、404 Not Found 或 410 Gone 的 HTTP 响应代码?

寻找有关如何处理 RESTful 资源树中缺失链接的一些指导,因为我已经阅读了很多但不是很多个人经验。

假设我们有以下资源结构:

/users/{userId}/accounts/{accoundId}/logs/{logId}

一个用户可以有多个账号,而这些账号又可以有很多订单,而订单又可以有很多日志。日志仅针对单个帐户存在,而帐户仅针对单个用户存在。没有账号就没有日志,没有用户就没有账号。

当我尝试解决以下问题时,我的问题来了:

/users/123/accounts/321/logs - POST
/users/123/accounts/321/logs/987 - GET
/users/123/accounts/321/logs/987 - PUT
/users/123/accounts/321/logs/987 - DELETE
/users/123/accounts/321/logs/987 - PATCH
/users/123/accounts/321/logs/987 - HEAD

但是这个资源不存在,或者不再存在:

/users/123/accounts/321

或者此资源不存在或不再存在:

/users/123

我可以说这是一个 400 错误请求,根据 RFC7231 :

6.5.1. 400 Bad Request

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

根据定义为真,除非在缓存尚未过期的情况下,这意味着应用程序尚未重新遍历层次结构,并且另一个应用程序已删除父资源。通过提供相关的机会锁,客户端将证明,根据其最后的知识,它正在发出语义上正确的请求。

即使这不是缓存的东西,因为失败的原因实际上是缺少/不可用的资源。然而,根据规范 RFC7231 :

6.5.4. 404 Not Found

The 404 (Not Found) status code indicates that the origin serverdid not find a current representation for the target resource or isnot willing to disclose that one exists. A 404 status code doesnot indicate whether this lack of representation is temporary or
permanent; the 410 (Gone) status code is preferred over 404 if the
origin server knows, presumably through some configurable means, thatthe condition is likely to be permanent.

6.5.9. 410 Gone

The 410 (Gone) status code indicates that access to the target
resource
is no longer available at the origin server and that this
condition is likely to be permanent.

这些似乎揭穿了这种本能。

有没有人有处理这种或类似情况的经验和好的方法?我觉得我应该选择感觉正确的东西以及使用此服务时我希望看到的东西,而不是文本中的字母。

最佳答案

请记住:HTTP 响应(包括元数据和状态代码)特定于请求的资源,而不是某些隐式层次结构。

也就是说

GET /users/{userId}/accounts/{accoundId}/logs/{logId}

requests:当前为目标资源选择的表示。参见 RFC 7231 ;特别是,该请求不会询问以下任何内容的表示:

/users/{userId}/accounts/{accoundId}/logs/
/users/{userId}/accounts/{accoundId}/
/users/{userId}
...

比那简单多了——我能得到我想要的吗?源服务器提供响应,可能是当前表示,也可能是一条消息,说明没有这样的表示可用。

/users/{userId}/accounts/{accoundId}/logs/{logId} 的表示不可用,因为 /users/{userId}/accounts/{ accoundId 不存在是一个实现细节

404通常是您想要用作状态代码以宣布目标资源的当前表示不可用的内容。对于为什么会出现这种情况的任何解释通常都会进入消息正文。例如,您可以使用 problem details 来描述它.

服务器没有义务发送资源的过期表示只是因为它恰好有一个资源(同样,缓存是一个实现细节)。

410 几乎是同一件事;这实际上是一个建议,客户可以将其书签标记为已弃用。

400如果您找不到更符合负载中消息语义的状态代码,这是一种非常合理的投注方式。但对于 404 确实满足您需求的这种情况,我不会使用 if。

关于缺少父资源的 REST HTTP 响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com