【问题标题】:Custom PHP Errors for AJAX callsAJAX 调用的自定义 PHP 错误
【发布时间】:2011-08-04 00:41:28
【问题描述】:

我正在构建一个 Web 应用程序,并且想知道如何处理我的 AJAX 调用错误。例如,如果用户输入了某种无效的数据(错误的电子邮件地址,用户已经存在),我希望能够从 PHP 中抛出错误。

我在这里看到http://php4every1.com/tutorials/jquery-ajax-tutorial/,您可以只使用 JSON 对象并处理来自 JQuery 的 Success 函数的错误报告,但这似乎不是正确的方法。对我来说,当出现错误时应该使用 jQuery 的错误函数是有意义的。我想我是那种东西的坚持者。

这就是我现在的做法。

//In my PHP file called from JQuery
function error($msg) {
    header("HTTP/1.0 555 ".$msg);
    die();
}
//Then that error is handled accordingly from JQuery

因此,我创建了一个错误代码 555(未定义为任何内容),并添加了我自己的自定义错误消息。这是正确的方法吗?我应该只使用 JSON 吗?必须有一种标准的方式来发送这样的错误消息,对吧?

如果您需要查看我的更多代码以获得更好的想法,整个项目都在 github 上:https://github.com/josephwegner/fileDrop。有问题的文件是config/phpFuncts.php

【问题讨论】:

  • 没有理由为此创建新的状态码,如果是用户输入验证错误,400 就可以了。它可以被认为是一个错误的请求(例如,他们的请求正文——他们的用户输入——格式错误)。

标签: php jquery ajax


【解决方案1】:

我只使用一个 JSON 对象和一个 200 的 HTTP 标头。请求本身没有任何问题,并且您的服务器按预期运行 - 错误出现在不同的抽象层上。

【讨论】:

    【解决方案2】:

    HTTP status codes400 系列表明请求存在问题。我会将响应代码设置为 400,并在响应正文中包含错误消息列表作为 JSON。

    【讨论】:

    • 同意。对于用户可以更正的错误,请使用 400 Bad Request(例如,他们有验证错误等)。对于数据库故障、致命错误等服务器异常,请使用 500 级状态码。
    【解决方案3】:

    我讨厌使用 HTTP 状态代码来指示失败。 HTTP 代码应为实际的 HTTP 级别错误保留,与 AJAX 请求相关的错误应通过 JSON 结构发回。

    例如

    $data = array()
    if (some big ugly computation fails) {
       $data['errorcode'] = -123;
       $data['error'] = true;
       $data['success'] = false;
       $data['errormessage'] = 'some helpful error message';
    } else {
       $data['success'] = true;
       $data['error'] = false;
       $data['response'] = 'whatever you wanted to send back....';
    }
    echo json_encode($data);
    

    然后在客户端

    if (data.error) {
       alert('Request blew up: ' + data.errormessage);
    }
    

    【讨论】:

    • 我不同意“应该为实际的 HTTP 级错误保留 HTTP 代码”。 HTTP 是一种协议,其中的状态代码反映了服务的响应。 4xx响应码用于客户端负责的问题,5xx响应码用于服务端负责的问题
    • 如果我开车去商店,但他们没有我想要的东西,我不会说这次旅行是失败的——车开动了,我停好了,我回家了——只是空着回家递。 AJAX 服务本身的错误应该在服务响应文本中发出信号,而不是在 HTTP 级别。在“失败”的 ajax 调用上返回 404 应该意味着“嘿,服务文件丢失”,而不是“对不起,数据库中的记录不存在”。
    • HTTP 状态码就是这样使用的。 “400 Bad Request”并不意味着 HTTP 失败。如果 HTTP 失败,您根本不会收到错误响应。 HTTP 没有报告它自己的性能。
    • 404 非常适合说“该内容不存在”,就像您可以从服务器请求文件并返回 404。使用常规 404,服务器仍然工作,就像您的 AJAX 调用/HTTP 仍在工作一样。我建议阅读 Roy Fielding 关于 REST 和 HTTP 应该在服务架构中扮演的角色的论文。 AJAX 是一种通信方式。如果失败,您要么没有响应,要么在服务器未能处理响应时使用 5xx 级别的响应状态。
    • 在阅读了这个非常有趣的辩论和理解并同意这两个角度之后——我仍然不知道哪一个是“最好”的方法——因为它可以双向使用!!
    猜你喜欢
    • 2014-06-07
    • 2013-11-12
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多