jquery ajax在解析失败时不会解析json

问题描述:

在失败时传递给回调的jQuery的jqXHR对象不解析json响应,因此responseJSON未定义,只有responseText可用。jquery ajax在解析失败时不会解析json

它工作正常的成功请求,我设置使用dataType: 'json'

调用正确的标题:

$.ajax({ 
    type: 'POST', 
    url: $form.attr('action'), 
    data: post_data, 
    dataType: 'json', 
    done: done_callback, 
    fail: fail_callback, 
    always: always_callback 
    }); 

请求报头:

Accept:application/json, text/javascript, */*; q=0.01 
X-Requested-With:XMLHttpRequest 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11 

响应头:

Content-Type:application/json;charset=utf-8 
Status:500 

的responseText:

{"status":"error","code":500,"message":"A system error occurred, please try again later"} 

responseJSON是不确定的

难道jQuery不会解析JSON时,Ajax请求的响应是不成功的情况? 我无法找到任何文件,以证实或否认这种行为(我可能只是不看够硬)

我可以明明只是在fail回调使用parseJSON

+2

你说得对。响应内容不是错误的。如果您在500错误中收到JSON,请自行解析。 – Strelok 2012-03-22 12:01:19

+1

是的。 @Arun非常正确地指出了jquery已经采取这一决定的确切路线,不通过类型转换器传递响应。 – Rob 2012-03-22 12:19:15

我看看到jQuery的Ajax回调方法。只有当(status >= 200 && status < 300 || status === 304)为真时,它才会进行dataType转换,否则响应会传递给相应的处理程序。这就是说,如果请求失败,那么响应不会按照预期的数据类型进行分析。

如果您想了解更多信息,您可以在jquery.js文件中查找以上条件并查看它的工作方式。

+1

确实,你有什么想法,为什么jQuery的具体编码,似乎很奇怪,响应数据是有效的,即使是错误。 HTTP1.1说“除了响应HEAD请求时,服务器应该包含一个包含错误情况说明的实体” – Rob 2012-03-22 12:00:30

+0

我认为这是因为他们认为如果请求失败,则响应内容可能不可靠 – 2012-03-22 12:15:15

+1

这不再是真的:http://bugs.jquery.com/ticket/13917#comment:2“*从此提交:[...]解析JSON在失败的情况下可用作jqXHR实例的responseJSON字段。*“ – Ashe 2013-11-27 01:46:42

我猜你正在寻找的是data.statusdata.statusText

+1

一个“数据”对象不会传递给失败回调,只有成功,我希望我的json作为一个对象 – Rob 2012-03-22 11:47:51

+0

这对我来说是新的,我创建的应用程序在一个web应用程序与约100个Ajax调用,我使用每一个'错误:函数(数据)alert(“data:”+ data.status +“”+ data.statusText); }'我没有问题 – 2012-03-22 11:55:23

+1

data.statusText正是HTTP1.1定义的文本,在我的情况“内部服务器错误”这不是我想要的,我想要的类型链接后的实际响应对象,而不是XHR对象,就像你获得成功回调一样。例如。 “{error:”error“,status:500,message:”我们现在无法收到您的消息。“} – Rob 2012-03-22 12:07:06

因为jQuery的1.5版本存在的StatusCode处理程序补充说:

$.ajax({ 
    statusCode: { 
    404: function() { 
     alert("page not found"); 
    } 
    } 
}); 

然而,在早期版本中,你应该单独解析响应文本则返回错误状态时:

$.ajax({ 
    success: function(response) { 
    data = $.evalJSON(response); 
    alert(data); 
    }, 
    error: function(response) { 
    data = $.evalJSON(response.responseText); 
    alert(data); 
    } 
}); 
+0

我认为原生函数是parseJSON而不是evalJSON,我得到:”evalJSON不是函数“使用jQuery 1.11.0 – 2015-06-24 02:23:12