【问题标题】:What is the correct HTTP error code to return, 404 vs 412?返回的正确 HTTP 错误代码是什么,404 与 412?
【发布时间】:2014-01-22 23:04:39
【问题描述】:

我正在设计 REST API。在家中创建房间的 POST 请求之一需要输入家庭 ID 和房间名称,例如:

POST  /webCall/development/construction
<?xml version="1.0"?><room><home id='110001'/><name>large bedroom</name></room>

所以我的问题是,假设家庭ID = 110001,在系统中不存在,那么应该404(未找到资源)作为响应码或412(前提条件失败)作为响应码。

可能的争论。

Why 404 : The resource home with ID : 110001 is not found.
Why 412 : The precondition to create a room is that a home should exist,which fails here.

请提供您的建议并说明理由,这将有助于我做出正确的决定。

【问题讨论】:

    标签: java web-services http rest http-response-codes


    【解决方案1】:

    由于 Sotirios 给出的原因,412 不正确。

    404 不正确,因为问题出在负载上,而不是寻址资源 (URI)。

    您可以使用 400(通用)、409 或 422。

    【讨论】:

    【解决方案2】:

    HTTP spec 表示以下关于 412 状态代码

    在一个或多个请求头字段中给出的前提条件 在服务器上测试时评估为 false。 此响应 代码允许客户端对当前资源设置先决条件 元信息(标头字段数据),从而防止请求 方法被应用到预期之外的资源。

    因此,如果您发送带有 If-Match 标头的 entity tag 您尝试添加的资源。

    假设您要发布到下面的内容

    /homes/some-identifier/rooms
    

    您可能应该返回 404,因为资源 /homes/some-identifier/rooms 不存在。

    如果你真的在做

    POST  /webCall/development/construction
    <?xml version="1.0"?><room><home id='110001'/><name>large bedroom</name></room>
    

    那么 409 可能是最合适的。但是,我建议您将 API 更改为 POST 到实际的 home 资源。

    【讨论】:

    • 如果URI在上面,那么404是正确的。但是,在示例中,URI 标识了一个通用处理程序,并且房间标识符在有效负载中。在这种情况下,404 将是错误的,因为请求 URI 标识的资源确实存在。
    • @JulianReschke 更新以使我的假设更加清晰。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2011-07-19
    • 1970-01-01
    • 2018-03-21
    • 2014-10-26
    相关资源
    最近更新 更多