未找到的子实体的正确HTTP状态代码是什么?

BCA*_*BCA 4 http

说我有资源

/Products/123
Run Code Online (Sandbox Code Playgroud)

并且每个在后端数据库中Product都有一个关联的Supplier实体.POST和PUT请求必须指定供应商ID,然后使用该ID从数据库中获取供应商实体.

如果用户发出什么应返回PUT /Products/123,这发现,但包括不良供应商ID,这是不是

404 Not Found 用一条消息指定找不到哪个资源?

409 Conflict

cas*_*lin 5

404状态代码可能不是正确的选择,因为一直没有找到的资源是不是你要求的目标:

6.5.4.404未找到

404(未找到)状态代码表示原始服务器没有找到目标资源的电流表示或不愿意透露一个存在.一个404状态代码并不表示这个缺乏代表性的是暂时的还是永久的; 如果原始服务器可能通过一些可配置的方式知道条件可能是永久性的,则410(Gone)状态代码优先于404.

409状态代码可能是适合这种情况,但不是最好的选择(我不会定义这种情况下作为冲突):

6.5.8.409冲突

409(冲突)状态代码表示请求无法完成,由于与目标资源的当前状态的冲突.此代码用于用户可能能够解决冲突并重新提交请求的情况.服务器应该生成一个有效载荷,其中包含足够的信息供用户识别冲突源.[..]

我会422在响应有效负载中使用明确描述的状态代码:

11.2.422不可处理的实体

422(处理的实体)状态代码表示的服务器理解的内容类型的请求实体的(因此一个 415(不支持的媒体类型)状态代码是不适当的),并且请求实体的语法是正确的(因而400(错误请求)状态代码是不合适的)但无法处理所包含的说明.例如,如果XML请求主体包含格式正确(即语法正确)但语义错误的XML指令,则可能发生此错误情况.

选择最合适的状态代码时,下图(摘自本页)非常有见地4xx:

选择正确的4xx状态代码