jQuery Ajax - 如何错误地获取响应数据

Posted

技术标签:

【中文标题】jQuery Ajax - 如何错误地获取响应数据【英文标题】:jQuery Ajax - how to get response data in error 【发布时间】:2012-02-22 10:03:57 【问题描述】:

我有一个简单的网络应用程序。 我创建了服务器 REST API,因此它将返回带有 HTTP 代码和 JSON(或 XML)对象的响应,其中包含更多详细信息:应用程序代码(特定于场景、描述所发生情况的消息等)。

所以,比如客户端发送Register请求,密码太短,响应HTTP码为400(Bad Request),响应数据为:appCode : 1020 , message : "Password is too short"

在 jQuery 中,我使用“ajax”函数来创建 POST 请求。当服务器返回不同于 HTTP 代码 200 (OK) 的内容时,jQuery 将其定义为“错误”。

错误处理程序可以获取3个参数:jqXHR、textStatus、errorThrown。 请问我可以获取服务器在错误情况下发送的JSON对象吗?

编辑:

1) 这是我的 JS 代码:

function register (userName, password) 
    var postData = ;
    postData["userName"] = userName;
    postData["password"] = password;

    $.ajax (
        dataType: "json",
        type: "POST",
        url: "<server>/rest/register",
        data: postData,
        success: function(data) 
            showResultSucceed(data);
            hideWaitingDone();
        ,
        error: function (jqXHR, textStatus, errorThrown) 

            showResultFailed(jqXHR.responseText);
            hideWaitingFail();
        
    )

2) 查看 Firebug 控制台时,响应似乎是空的。 当使用 REST 测试工具调用相同的请求时,我得到一个带有 JSON 对象的响应。

我做错了什么?

【问题讨论】:

如果你没有达到接受的答案;这段代码没有问题,问题出在其他地方。 对于其他未来的读者,我也有类似的问题,虽然跨域问题与我的情况完全无关,但事实证明问题出在服务器端。 (似乎服务器代码被破坏了,一些 HTTP 标头(如 Accept)的组合使其无法在 400 错误时返回正确的响应正文。) 【参考方案1】:

这是一个如何在错误时获取 JSON 数据的示例:

$.ajax(
    url: '/path/to/script.php',
    data: 'my':'data',
    type: 'POST'
).fail(function($xhr) 
    var data = $xhr.responseJSON;
    console.log(data);
);

来自the docs:

如果指定了 json,则使用 jQuery.parseJSON 解析响应,然后将其作为对象传递给成功处理程序。解析后的 JSON 对象可通过 jqXHR 对象的 responseJSON 属性获得。

否则,如果responseJSON不可用,您可以尝试$.parseJSON($xhr.responseText)

【讨论】:

"$.parseJSON($xhr.responseText)" 是关键!如果不使用“.fail”,而是使用错误: function(xmlHTTP, status, httperror) $.parseJSON(xmlHTTP.responseText); 【参考方案2】:

directly from the docs

$.ajax() 返回的 jQuery XMLHttpRequest (jqXHR) 对象 jQuery 1.5 是浏览器原生 XMLHttpRequest 的超集 目的。例如,它包含 responseText 和 responseXML 属性,以及 getResponseHeader()

所以使用 jqXRH 参数并从中获取 responseText 属性。

在上面的链接中,查找标题为

的部分

jqXHR 对象

【讨论】:

@gdoron 添加了要查找的链接和部分 @tibo,然后向我们展示您的代码。有什么不对劲。最好使用 firebug 或 webkit 在处理程序中暂停执行,然后查看参数的属性。它必须在某个地方...... 没有实际挖掘,我现在不确定。您确定萤火虫中的响应正文为空吗?你确定网址正确吗?您确定正在调用错误处理程序吗? 这应该是公认的答案 - 问题中的代码是正确的。问题完全超出了所提供信息的范围。【参考方案3】:

我在使用 multipart/form-data 时也遇到了同样的问题。起初我认为 multipart/form-data 造成了这种混乱,但后来我找到了正确的解决方案。

1) 之前的JS代码:

var jersey_url = "http://localhost:8098/final/rest/addItem/upload";
var ans = $.ajax(
    type: 'POST',
    enctype: 'multipart/form-data',
    url: jersey_url,
    data: formData,
    dataType: "json",
    processData: false,
    contentType: false 
    success : funtion(data)
      var temp = JSON.parse(data);
      console.log("SUCCESS : ", temp.message);  
    
    error : funtion($xhr,textStatus,errorThrown)
       console.log("ERROR : ", errorThrown);
       console.log("ERROR : ", $xhr);
       console.log("ERROR : ", textStatus);
    
    );

这里发生错误时,它在控制台中向我显示了这个:- 错误 : 错误:中止:f(e),总是:f(),....,responseJSON:“”message“:”失败“” 错误:错误 因此我知道我们必须使用 $xhr.responseJSON 来获取我们从 rest api 发送的字符串消息。

2) 修改/工作错误函数:

error : funtion($xhr,textStatus,errorThrown)
        var string= $xhr.responseJSON;
        var json_object= JSON.parse(string);
        console.log("ERROR : ",  json_object.message);
    

这样会在控制台输出"Error : failed"

【讨论】:

【参考方案4】:

在这个问题上花了这么多时间,我发现了问题。

该页面位于 URL 下:www.mydomain.com/register REST api 位于 URL 下:server.mydomain.com/rest

好像这种POST没那么简单。 我将搜索更多信息以更好地了解此问题(如果您有更多信息,请与我分享)。

将 REST API 放在 www.mydomain.com/rest 下时 - 一切正常。

【讨论】:

以上是关于jQuery Ajax - 如何错误地获取响应数据的主要内容,如果未能解决你的问题,请参考以下文章

JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)

当我执行ajax并返回错误时,Jquery获取自定义响应内容[重复]

如何从 jQuery.ajax 获取响应状态码?

如何获取 jQuery.ajax 响应状态?

jQuery Ajax 返回 404 错误,但响应正确

等待ajax响应时如何防止用户交互?