【问题标题】:What HTTP error code for failure to create a new resource because a parent entity is gone由于父实体消失而无法创建新资源的 HTTP 错误代码
【发布时间】:2011-08-17 05:41:30
【问题描述】:

假设我有一个 API 公开两个相关资源,公司有很多员工。

假设我创建了一个新公司:POST http://domain/api/company/,它返回类似 http://domain/api/company/123 的内容。

如果 company/123 已从系统中删除(例如通过 DELETE),则 GET http://domain/api/company/123 可能会返回 HTTP 响应代码 410(已消失)。

我的问题是这样的。如果我现在尝试通过执行 POST http://domain/api/employees/(在请求正文中将 companyId 设置为 123)在 Company/123 下创建一个员工,由于请求无效,服务器应该发回什么 HTTP 响应代码?

例如请求格式正确,但由于公司 123 已消失,因此出现逻辑错误。

内部服务器错误 500?

【问题讨论】:

    标签: api http rest


    【解决方案1】:

    不是500,因为服务器没有问题。

    我会建议 409 冲突。

    来自 RFC:

    由于与资源的当前状态冲突,请求无法完成。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。响应正文应该包含足够的信息让用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;但是,这可能是不可能的,也不是必需的。响应 PUT 请求时最有可能发生冲突。例如,如果正在使用版本控制并且被 PUT 的实体包括对资源的更改,这些更改与早期(第三方)请求所做的更改相冲突,则服务器可能会使用 409 响应来指示它无法完成请求.在这种情况下,响应实体可能会以响应 Content-Type 定义的格式包含两个版本之间差异的列表。

    它不完全符合你的情况,但它非常接近恕我直言。

    例如,服务器可以告诉您不存在您可以发布到的父资源,并且您可以将员工“重新提交”到其他公司。 :)

    【讨论】:

    • 我很惊讶这不是一个更常见的问题,因为 REST API 通常会引导我们对单个实体进行操作。感谢您的回复。
    【解决方案2】:

    我在这里遇到了同样的情况。

    在评估 HTTP 状态代码选项后,在我看来最好的选择是返回 424 Failed Dependency

    424(Failed Dependency)状态码意味着该方法可以 由于请求的操作,不在资源上执行 依赖于另一个动作,而那个动作失败了。例如,如果一个 PROPPATCH 方法中的命令失败,然后,至少,其余的 命令也将失败并显示 424(失败的依赖项)。

    From RFC

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      相关资源
      最近更新 更多