要在未找到的子资源上返回的状态代码

时间:2014-08-11 09:06:30

标签: rest http http-status-codes

所以,让我们说我有两个资源,钱包和用户。用户和电子钱包具有一对一的关系。在我的REST API中,我提供了一个选项,可以通过ID为用户提供不同的Wallet。因此,将用户移动到其他钱包的典型HTTP PUT请求可能如下所示:

PUT /api/user/3 HTTP/1.1
Host: api.myuserandwalletwebsite.com

{
    "wallet_id": 15
}

这将更新用户以使用id = 15的钱包。但是,如果PUT请求包含在数据库中找不到的wallet_id,该怎么办?那么REST API应该返回什么?只是一个简单的404?

在未找到的子资源上返回404对我来说感觉很奇怪,因为404会产生误导:您可能认为404实际上是指未找到用户。

3 个答案:

答案 0 :(得分:8)

404 (Not Found)绝对不是正确的响应代码。您想要的响应代码是422 (Unprocessable Entity)

  

422(不可处理实体)状态代码表示服务器
  了解请求实体的内容类型(因此a   415(不支持的媒体类型)状态代码不合适),和   请求实体的语法是正确的(因此是400(错误请求)
  状态代码不合适但是无法处理包含的内容   说明。
   - RFC 4918

这是一个易于理解且定义明确的响应代码,可以在IANA维护的Hypertext Transfer Protocol (HTTP) Status Code Registry中找到。

作为旁注,根据spec,您没有使用HTTP PUT。 PUT应以幂等方式更新资源的全部内容。您应该使用PATCH或POST。

作为替代方案,您可以考虑加入资源,例如/ user-wallet端点。根据您的API的具体情况,这可能有意义也可能没有意义。

答案 1 :(得分:0)

在我使用REST-API的应用程序中,我尝试遵循此处描述的最佳做法:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 我知道GOOD软件开发公司的许多程序员也会关注这一点。 正如在未找到资源的情况下的最佳实践中所描述的那样,只需简单使用:

404 Not Found - When a non-existent resource is requested 

这是第一种情况 - 常见的最佳做法。

第二:最好的REST-API实践背后的事情是你的应用程序逻辑: 我想你有一些基于你的app逻辑的选项:

404 Not Found - When a non-existent resource is requested because You requested non-existing wallet

405 Method Not Allowed - You cant put because wallet not found and it is required for update

422 Unprocessable Entity - Used for validation errors because we have validation in our app that check for incomming requests

所以具体状态只是你的决定。请记住,您选择的选项将为您的逻辑应用程序的其余部分传播,因此请保持一致并考虑REST-API,如专用于其他应用程序的GUI

答案 2 :(得分:0)

就像你已经提到过的那样:我也不会使用404,因为这意味着无法找到用户。由于您想要更新您的用户资源并且此更新由于无效数据(对无效电子钱包的引用)而失败,我宁愿使用400错误请求并向其他标题字段添加有意义的消息(例如,X-Message:带有ID的电子钱包15找不到。)

HTTP 422不可处理的实体也是一个好主意,但RFC2616中没有涉及。如果这个“扩展”没有问题,你可以选择这个。

HTTP 405在这里不正确,因为这意味着通常不允许在用户资源上使用PUT方法,并且在向资源触发OPTIONS时不会包含PUT。