所以,让我们说我有两个资源,钱包和用户。用户和电子钱包具有一对一的关系。在我的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实际上是指未找到用户。
答案 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。