未找到的数据库服务器文件的正确状态代码?

Correct status code for database server file that's not found?

我正在我的网站中实施数据库并了解 http 状态代码。我正在尝试针对请求可能引起的任何问题实施解决方案,我想过在连接到数据库以更新或查询它时,如果文件在服务器端不存在(它可能是否已暂时关闭以停止传输任何数据?)。我会向用户实施自定义消息以通知他们,但想知道此响应的 'correct' 状态代码是什么?我已将其缩小为 404(未找到文件)或 503(服务不可用)或其他我不知道的?

PHP 有帮助的代码

try {
    if (!file_exists("dbConn.php")) {
        throw new Exception("File Not Found");
    } else {
        require_once("dbConn.php");
        $dbConn = getConnection();
    }
    // other code
} catch (Exception $e) {
    if ($e->getMessage() == "Bad Request") {
        http_response_code(400); // This is for an exception thrown in 'other code' (not displayed)
    } else {
        // http_response_code(404) or http_response_code(503) or other?
    }
}

5xx 状态代码在这里比较合适。 503 或 500 似乎都合理,具体取决于您认为此特定错误的预期程度与意外程度。

404 表示用户请求的资源不存在。他们在这种情况下吗?某些支持后端服务可能不存在或可能会失败,但这不是用户关心的问题。 HTTP 状态代码指的是 HTTP 资源,而不是您的后端基础设施。并且用户请求了正确的资源。

当返回任何 4xx 状态代码时,问问自己:

Is there anything the user can do to modify their request to correct the problem?

如果答案是否定的,那么这不是客户端错误,而是服务器错误。这将问题置于 5xx 区域。


顺便说一句,这看起来像是对异常的不当使用:

if (!file_exists("dbConn.php")) {
    throw new Exception("File Not Found");
} else {
    //...
}

这基本上是对控制流使用异常,这正是 if 已经实现的目的。您已经在 if 条件下确定您要查找的文件不可用。在 if 块中,您可以制作响应并结束脚本的执行。

所以可能是这样的:

if (!file_exists("dbConn.php")) {
    http_response_code(500);
    die 'Unable to process the request.';
}
// No need for an "else" here, just continue as normal

这种东西通常被称为"guard clause"。在您的整体操作开始时,您检查您的先决条件并在必要时失败。如果所有保护子句都通过,则代码可以安全地继续。