如何确定ajax请求中的失败

时间:2011-11-16 21:47:39

标签: php ajax mootools

我正在与Mootools合作开发一个简单的ajax-y页面,该页面使用PHP作为后端对db记录进行一些操作。

我正在向调用函数的PHP页面提交ajax请求,如果能够更新/删除记录,则返回TRUEFALSE

但是,似乎mootools onSuccess事件在服务器返回200状态时被触发,无论返回的值如何(例如,FALSE仍然被认为是成功的)。

如何以有意义的方式使用onSuccess,而不是返回40x错误代码?

3 个答案:

答案 0 :(得分:3)

@dombenoit和@Marc提供的所有答案在技术上都是正确的。

但是,我完全不同于@ Marc的愿景:对我而言,使用HTTP状态代码对于Web服务来说既高效又常见。我一直都在使用它们,而不是输出文本,主要是出于以下原因:

  1. 他们为处理错误的值提供了一个免费的标准,而不是让你输出文本并在客户端解析它,意味着语义重复;
  2. 他们让所有工具都能理解出错了,因为问题本身就是概述;
  3. 他们对REST架构感到满意。
  4. 为了支持这一愿景,这里有一个问题:你的通话目标是什么?是更新还是删除记录?然后,如果没有达到这个目标,那就出错了。它失败了,应用程序应该在应用程序级别知道它,而不是先说200/OK,然后在文本响应中进行预处理,它没有!对我来说,感觉就像使用"undefined"而不是undefined

    所以,在这里,我会让PHP发送一个HTTP错误状态代码,即4xx - 5xx范围内的代码。


    然后,好问题是:使用哪个代码?这是一个完全取决于您的应用程序和您想要达到的特异程度的设计决策。

    • 如果调用的目标是更新/删除,并且它不会发生的事实极不可能,并且是意外,严重错误(例如:数据库不一致,因为有调用无法引用不存在的实体),那么您应该使用500 / Internal Server Error
    • 如果可能目标实体在通话时不存在而不是严重错误(例如:您的应用提供了几种删除项目的方法,那么另一个可以用来代替这个调用),然后我建议410 / Gone:你得到一个清晰,富有表现力的错误处理,免费!您仍然可以使用500来解决实际错误(数据库连接异常......)。
    • 然后,您可以更加具体地了解更新错误,例如使用409 / Conflict,如果这是您尝试通过更新预测的错误类型...

    我在设计网络应用时总是看一下HTTP status codes reference


    只是为了完成,这就是你在PHP中发送标题的方式(至少没有框架 - 检查具体情况):

    header("HTTP/1.0 404 Not Found");
    

    更新:因为您似乎决定使用建议使用JSON编码成功或失败的答案,所以我必须添加以下关于弹性的要点。

    不依赖于状态代码,仅在应用程序级数据上使您的代码非常脆弱。实际上,在某些情况下会出现实际意外的错误。不是您自己提出的应用程序级“异常”,而是较低级别的错误(服务器不可用,导致服务器崩溃的错误配置,更改了路由系统......)。这些都将通过HTTP状态代码(或通过超时)显示,但不是通过JSON编码的答案,因为您的应用程序在能够输出任何内容之前已经崩溃。

    就像@Dimitar所说,从编程的角度来看,这在某种程度上是“天真的”:你不仅要信任你的代码(你不应该),还要信任环境(服务器)和网络。这是一个非常非常乐观的愿景。

    使用状态代码作为处理预期异常情况的标准方法,可以免费处理这些意外情况:您已经注册了除onSuccess以外的其他处理程序,并且可能是好的处理程序(重试一次,通知用户) ,提供备用可能性......)。

答案 1 :(得分:2)

Personaly,我觉得使用HTTP状态代码来指示服务器上应该发生的任何事情的成功/失败是不正确的。关于HTTP调用本身的一切都很完美 - 服务器无法完成请求的事实并不意味着HTTP请求失败。

这就像开车到商店买东西,却发现它缺货。返回HTTP 404对我来说意味着商店本身已经消失了。然而,你已成功开车到商店,走进去,走回去,开车回家。

因此,使用JSON数据结构来指示所请求事务的结果,您可以在客户端代码中检查该结果:

$results = array()
$results['success'] = false;
$results['failure_code'] = XXX; // some code meaningful to your app
$results['failure_message'] = 'Something dun gone blowed up, pa!';
echo json_encode($results);

然后在你的Moo代码中:

if (!results['success']) {
   alert("AJAX call failed: " + results['failure_message']);
}

如果通话有效,那么你有

$results = array();
$results['success'] = true;
$results['data'] = ....;

答案 2 :(得分:2)

您有两个选项,其中两个是您在问题中提到的。您可以使用onSuccess并根据true / false响应执行一些代码,如下所示:

onSuccess: function(responseText, xml){
    if(responseText == "false"){
        // do something...
    }
}

或者您可能会在PHP代码中引发错误,返回实际有效的错误代码,从而触发onFailure事件。

或者如Marc先前提到的,您可以使用JSON响应格式,在这种情况下,您将使用MooTools的Request.JSON。

onSuccess: function(responseJSON, responseText){
    // do something...
}