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

jaa*_*apz 4 rest http http-status-codes

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

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

{
    "wallet_id": 15
}
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*ein 8

404 (Not Found)肯定不是正确的响应代码.您想要的响应代码是422 (Unprocessable Entity).

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

它是一个易于理解且定义明确的响应代码,可以在IANA维护的超文本传输​​协议(HTTP)状态代码注册表中找到.

另外,根据规范,您没有使用HTTP PUT .PUT应以幂等方式更新资源的全部内容.您应该使用PATCH或POST.

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