【问题标题】:Correct response code for an invalid POST request无效 POST 请求的正确响应代码
【发布时间】:2015-02-18 17:40:16
【问题描述】:

我刚刚注意到我的应用程序中可能有一些不正确的地方。在很多时候,我都会发布需要某些输入参数才能继续插入数据的表单。例如,要将用户添加到您的联系人列表中,首先该用户必须存在,我这样做很简单

$db = \Database::connection();
$user = new \Models\User();
$user->getById($data['id'], $db);

if ($user->id) {
    if (\Models\User::auth()->addContact($user, $db)) {
        return \Response::json(['text' => 'Contact added']);
    } else {
        throw new \Exception('User not found', 404);
    }
}

忽略所有其他可能的错误,只关注user not found 一个,我只是注意到我返回了一个 404 代码,我对此表示怀疑。在我编写这段代码的时候,我肯定被消息中的not found 部分激怒了,并自动认为这是一个 404 错误。不过现在想起来404错误其实是“找不到资源”,不求资源怎么找不到资源,这是我的逻辑。

向 POST 请求返回 404 错误是否正确,或者我应该切换到 400?

【问题讨论】:

    标签: http response


    【解决方案1】:

    正在更新的资源是用户联系人列表 - 类似于 User/[userid]/ContactList ?此资源已正确识别,但添加到联系人列表的用户无效。

    http rfc 中的 404 是“服务器没有找到任何匹配请求 URI...” 基于已找到要更新的资源,我会发现出现此错误的行为令人惊讶。如果您要返回 404,那么它应该包含一个消息正文,指出没有找到哪个资源。

    400 表示“由于语法错误,服务器无法理解请求。客户端不应该在没有修改的情况下重复请求”。我认为语法是正确的,所以 500(内部服务器错误)加上响应正文中的解释更合适。

    【讨论】:

    • "The client SHOULD NOT repeat the request without modify" 我认为这完全符合这种情况,请求不应该以相同的 id 重复,因为它是无效的,因此应该在请求正文。此外,我记得最近在某处读过(无法真正说出最近的情况)错误 400 描述已被更改,以适应我的情况。这些论点不成立吗?编辑:发现了一些东西stackoverflow.com/a/10849290/2415293
    • 不完全 - 在这种情况下,如果客户端要发送一个创建丢失的用户资源的新请求,然后重新发送未修改的原始请求,它将起作用。
    • 这是真的,但不太可能发生。此外,代码 400 的较新描述指出请求可能有效,但服务器拒绝处理它。我认为错误 500 应该用于实际的服务器错误(脚本错误等),而不是无效的用户输入。即使我错了,我也会安慰自己,有些网站使用 POST 来获取数据并使用 GET 来发布,所以至少我做到了.. :D
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 2021-08-11
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2012-12-14
    相关资源
    最近更新 更多