假设我有一个API公开两个相关资源,公司有很多员工。
假设我创建了一个新公司:POST http://domain/api/company/,返回类似http://domain/api/company/123的内容。
如果从系统中删除company / 123(例如删除),则GET http://domain/api/company/123可以返回HTTP响应代码410(Gone)。
我的问题是这个。如果我现在尝试通过执行POST http://domain/api/employees/(在请求正文中将companyId设置为123)在Company / 123下创建一个Employee,由于请求无效,服务器应该发回哪些HTTP响应代码?
E.g。请求被正确格式化,但由于公司123已经消失,因此存在逻辑错误。
内部服务器错误500?
答案 0 :(得分:21)
不是500,因为服务器没有问题。
我建议409冲突。
来自RFC:
由于与资源的当前状态发生冲突,无法完成请求。此代码仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许。响应主体应该包含足够的信息供用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;但是,这可能是不可能的,也不是必需的。冲突最有可能发生在响应PUT请求时。例如,如果正在使用版本控制并且包含PUT的实体更改为与早期(第三方)请求所产生的资源冲突的资源,则服务器可能会使用409响应来指示它无法完成请求。在这种情况下,响应实体可能包含由响应Content-Type定义的格式的两个版本之间的差异列表。
它与你的情况不完全一致,但它非常接近恕我直言。
例如,服务器可以告诉您不存在您要发布的父资源,并且您可以将该员工“重新提交”给其他公司。 :)
答案 1 :(得分:1)
我在这里遇到了同样的情况。
在评估HTTP状态代码选项后,在我看来最好的选择是返回 424失败的依赖
424(失败的依赖关系)状态代码表示该方法可以 由于请求的操作,不对资源执行 取决于另一个行动,该行动失败了。例如,如果是 PROPPATCH方法中的命令失败,然后至少是其余的 命令也会因424(失败的依赖关系)而失败。