jQuery:如何从 $.ajax.error 方法中获取 HTTP 状态代码?

Posted

技术标签:

【中文标题】jQuery:如何从 $.ajax.error 方法中获取 HTTP 状态代码?【英文标题】:jQuery: How to get the HTTP status code from within the $.ajax.error method? 【发布时间】:2011-10-05 18:16:40 【问题描述】:

我正在使用 jQuery 发出 AJAX 请求。无论 HTTP 状态代码是 400 错误还是 500 错误,我都想执行不同的操作。我怎样才能做到这一点?

$.ajax(
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data)
        alert('horray! 200 status code!');
    ,
    error: function(data)
        //get the status code
        if (code == 400) 
            alert('400 status code! user error');
        
        if (code == 500) 
            alert('500 status code! server error');
        
    ,
);

更新:

@GeorgeCummins 提到使用响应正文“似乎很奇怪”。这是我第一次尝试做这种事情。我的方法不是最佳实践吗?你会推荐什么?我在这里为此创建了另一个 *** 问题:What response/status code should I send to an AJAX request when there is a user/form validation error?

【问题讨论】:

【参考方案1】:

您应该使用statusCode 设置创建一个动作映射:

$.ajax(
  statusCode: 
    400: function() 
      alert('400 status code! user error');
    ,
    500: function() 
      alert('500 status code! server error');
    
  
);

Reference(滚动到:'statusCode')

EDIT(回应 cmets)

如果您需要根据响应正文中返回的数据采取措施(我觉得这很奇怪),您需要使用 error: 而不是 statusCode:

error:function (xhr, ajaxOptions, thrownError)
    switch (xhr.status) 
        case 404:
             // Take action, referencing xhr.responseText as needed.
    
 

【讨论】:

我从那条路线开始,但不知道如何获取数据。您如何访问响应正文? @Andrew:为什么需要访问响应正文?您是否希望在发生 400 或 500 错误时返回有用的数据? 是的,我使用状态码 400 来处理表单验证错误。 (不确定这是否合适) 在这种情况下,您能否在400: function() 的正文中采取适当的表单验证操作。只需删除 alert() 并添加必要的代码。 为什么告诉 API 调用者确切的问题是什么而不是告诉他们 400 很奇怪。【参考方案2】:

使用

   statusCode: 
    404: function() 
      alert('page not found');
    
  

-

$.ajax(
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data)
        alert('horray! 200 status code!');
    ,
    statusCode: 
    404: function() 
      alert('page not found');
    ,

    400: function() 
       alert('bad request');
   
  

);

【讨论】:

如何捕捉意外的 statusCode,这个版本的语法中是否有 catch-all 或 else 处理程序?【参考方案3】:

如果您使用的是 jQuery 1.5,那么 statusCode 可以工作。

如果你使用的是 jQuery 1.4,试试这个:

error: function(jqXHR, textStatus, errorThrown) 
    alert(jqXHR.status);
    alert(textStatus);
    alert(errorThrown);

您应该会看到第一个警报的状态代码。

【讨论】:

哦,我明白了我的问题。我在想data 被传递给错误方法,但实际上是jqXHRtextStatuserrorThrown 我喜欢你的回答,因为你提到了不同版本的 jQuery 之间的差异,我一开始并没有注意到。 我在 jQ 2.x 中使用您的示例,状态始终为零 (0),textStatus 始终为“错误”,错误抛出为空。有任何想法吗?我做了什么:页面加载后关闭服务器以弄清楚发生了什么。 当我得到状态码 419 时它对我有用,我可以处理错误。【参考方案4】:

另一种解决方案是使用 response.status 函数。这将为您提供 ajax 调用返回的 http 状态。

function checkHttpStatus(url)      
    $.ajax(
        type: "GET",
        data: ,
        url: url,
        error: function(response) 
            alert(url + " returns a " + response.status);
        , success() 
            alert(url + " Good link");
        
    );

【讨论】:

这个解决方案最好【参考方案5】:

在这里你也可以使用它,它对我有用

$.ajax(
  success: function(data, textStatus, xhr) 
    console.log(xhr.status);
  ,
  complete: function(xhr, textStatus) 
    console.log(xhr.status);
   
);

【讨论】:

以上是关于jQuery:如何从 $.ajax.error 方法中获取 HTTP 状态代码?的主要内容,如果未能解决你的问题,请参考以下文章

jquery ajax error函数和及其参数详细说明 (转)

jQuery ajax error:parserror

JQuery AJAX error参数

jQuery ajax error函数的参数(交互错误信息的获取)

ajax error怎么解决

如何使用 JQuery 或 Javascript 使用动态路径从 JSON 对象中删除