从jQuery 1.9开始,如果在调用dataType: json
时指定.ajax
,但无法将响应主体成功解析为JSON,则请求将无提示失败:
以严格的方式解析JSON数据;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。从jQuery 1.9开始,空响应也被拒绝;服务器应该返回null或{}的响应。
换句话说,即使服务器返回成功代码,jQuery仍会考虑请求"失败"如果响应不包含有效的JSON。因此,它将解析.fail()
回调而不是.done()
回调。
如何覆盖此行为,以便jQuery将请求解释为成功(并调用.done()
),即使它无法正确解析响应正文?
答案 0 :(得分:1)
.ajax
使用的JSON解析器(内置浏览器解析器和jQuery解析器)如果无法解析响应,将throw an exception。此异常是触发.fail()
的原因。
要覆盖此行为,您需要定义custom converter以在处理您期望作为JSON的响应时捕获此异常:
$.ajax({
// We're expecting a JSON response...
dataType: 'json',
// ...but we need to override jQuery's strict JSON parsing
converters: {
'text json': function(result) {
try {
// First try to use native browser parsing
if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
return JSON.parse(result);
} else {
// Fallback to jQuery's parser
return $.parseJSON(result);
}
} catch (e) {
// Whatever you want as your alternative behavior, goes here.
// In this example, we send a warning to the console and return
// an empty JS object.
console.log("Warning: Could not parse expected JSON response.");
return {};
}
}
},
...
答案 1 :(得分:-2)
请勿使用dataType: 'json'
。使用dataType: 'text'
并在JSON.parse()
或success:
回调中明确致电.done()
。如果JSON无效,您可以将其包装在try/except
中以捕获错误。
如果您需要在没有此选项的情况下发送Accept: application/json
,请尝试使用:
headers: { Accept: 'application/json' }
或
beforeSend: function(jqXHR, options) {
jqXHR.setRequestHeader('Accept', 'application/json');
}