我想用JSON中的响应发出Ajax请求。所以我提出了这个Ajax请求:
$.ajax({
url: 'http://my_url',
dataType: "json",
success: function(data){
alert('success');
},
error: function(data){
alert('error');
},
complete: function(data) {
alert('complete')
}})
这段代码工作正常,但是当我的网址发送给我一个HTTP代码404时,没有使用回调,甚至是完整的回调。经过研究,这是因为我的dataType是'json'所以404返回是HTML并且JSON解析失败了。所以没有回调。
有一个解决方案,当404被引发时调用回调函数?
编辑:完成回调不调用返回是404.如果你想要一个URL机智404你可以调用:http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697它是这个URL我有我的问题。
$.ajax({
url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697',
dataType: "json",
success: function(data) {
alert('success');
},
error: function(data) {
alert('error');
},
complete: function(xhr, data) {
if (xhr.status != 0)
alert('success');
else
alert('fail');
}
})
以下解决方案对我来说工作正常:)
$.ajax({
url: 'http://my_url',
dataType: "json",
success: function(data){
alert('success');
},
error: function(data){
alert('error');
},complete: function(xhr, data) {
if(data==="parsererror"){
alert('404');
}
}
});
使用您的配置,jQuery使用jsonp来传输数据。这可以通过动态插入脚本元素并将URL设置为指定值来实现。然后,服务器返回的数据被评估为JavaScript - 通常调用提供的回调。如果服务器返回404,则内容显然不是JavaScript,并且永远不会调用回调。某些浏览器支持脚本标记上的错误处理程序,在这些情况下会调用它们。不幸的是,IE不支持这一点。检测错误的最佳方法是依赖超时。
在您的情况下,您应该指定一个额外的timeout
选项,如果未及时调用回调,则会导致调用错误处理程序(404响应就是这种情况)。
$.ajax({
url: 'http://my_url',
timeout: 2000, // 2 seconds timeout
dataType: "json",
success: function(data){
alert('success');
},
error: function(data){
alert('error');
},
complete: function(data) {
alert('complete')
}
});
如果您想在使用Javascript和jsonp访问Twitter API时处理错误,则需要在请求中包含参数suppress_response_codes
。这使得来自Twitter API的所有响应都以200 OK
响应进行响应并包含错误。然后,您需要检查响应是否包含error
参数。
$.ajax({
url: "https://api.twitter.com/1/users/show.json",
dataType: 'jsonp',
jsonp: "callback",
data: {
screen_name: "simongate1337",
suppress_response_codes: true // <- Important part
},
success: function(data) {
if(data.error) {
console.log("ERROR: "+data.error);
} else {
console.log("Success, got user " + data.screen_name);
}
}
});
使用statusCode
-Option
$.ajax({
url: 'http://my_url',
dataType: "json",
statusCode: {
404: function() {
alert("I could not find the information you requested.");
}
},
success: function(data) {
alert('success');
},
error: function(data) {
alert('error');
},
complete: function(data) {
alert('complete');
}
})
您是否认为问题不在于dataType,而在于您不允许进行跨域请求?
当您从同一域请求数据时,下面的代码按预期工作,而当您发出跨域请求时,代码则不然:
function handle404(xhr){
alert('404 not found');
}
function handleError(xhr, status, exc) {
// 0 for cross-domain requests in FF and security exception in IE
alert(xhr.status);
switch (xhr.status) {
case 404:
handle404(xhr);
break;
}
}
function dumbRequest() {
var url = 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697';
url = 'http://twitter.com/';
url = '/mydata.json';
// url = 'mydata.json';
$.ajax(
{url: url,
dataType: 'json',
error: handleError}
);
}
是因为dataType
设置为“json”吗?如果是这样,请尝试将其更改为text
并自行评估JSON:
$.ajax({
url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697',
dataType: 'text',
success: function(data, status, xmlHttp) {
try {
data = eval('(' + data + ')');
alert('success');
} catch (e) {
alert('json parse error');
}
},
error: function(xmlHttp, status, error) {
alert('error');
},
complete: function(xmlHttp, status) {
alert('complete');
}
});
您是否知道即使HTTP状态为404,实际正文也是有效的JSON?例如,this link具有以下JSON:
jsonp1269278524295({"request":"/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697","error":"Not found"})
因此,您应检查您的数据是否在正常回调函数中具有error
属性。
更新:显然,即使页面的实际内容是有效的JSON,浏览器(我在Firefox中检查)也没有执行它,很可能是因为它是404.因为jQuery必须添加一个script
元素(因为交叉 - 域问题),它的JSONP包装器永远不会被调用,因此,你的回调也不会。
所以,简而言之,我认为没有办法处理这个问题,而无需手动添加脚本元素并检查之后是否调用了预定义的回调函数。
刚刚遇到同样的问题,并且看到another question提到jQuery-JSONP (jQuery Plugin)支持捕获404错误或者他们描述:“网络故障或错误的JSON响应时的错误恢复”
它完美:)
以下是通过JSONP获取YouTube视频详细信息的(简化)代码:
$.jsonp(
{
url: "https://gdata.youtube.com/feeds/api/videos/ee925OTFBCA",
callbackParameter: "callback",
data:
{
alt: "jsonc-in-script",
v: "2"
},
success: function(json, textStatus)
{
console.log("WEEEEEEEE!");
},
error: function(xOptions, textStatus)
{
console.error(arguments);
}
});
这是我如何处理这个问题。在尝试使用它之前,我检查返回的数据是否有错误。下面显示的只是一个示例,您可以扩展到更符合您的要求。这也考虑了会话超时和其他场景......
我最初的电话:
$.ajax({ type: 'POST',
url: '../doSomething',
data: 'my data',
success: function(data) {
if (HasErrors(data)) return;
var info = eval('(' + data + ')');
// do what you want with the info object
},
error: function(xmlHttpRequest) {
ReportFailure(xmlHttpRequest);
}
});
以及两个辅助函数:
function HasErrors(data) {
if (data.search(/login\.aspx/i) != -1) {
// timed out and being redirected to login page!
top.location.href = '../login.aspx';
return true;
}
if (data.search(/Internal Server Error/) != -1) {
ShowStatusFailed('Server Error.');
return true;
}
if (data.search(/Error.aspx/) != -1) {
// being redirected to site error reporting page...
ShowStatusFailed('Server Error. Please try again.');
return true;
}
return false;
}
和
function ReportFailure(msg) {
var text;
if (typeof msg == 'string') {
text = msg;
}
else if (typeof msg.statusText == 'string') {
if (msg.status == 200) {
text = msg.responseText;
}
else {
text = '(' + msg.status + ') ' + msg.statusText + ': ';
// use the Title from the error response if possible
var matches = msg.responseText.match(/\<title\>(.*?)\<\/title\>/i);
if (matches != null)
{ text = text + matches[1]; }
else
{ text = text + msg.responseText; }
}
}
// do something in your page to show the "text" error message
$('#statusDisplay')
.html('<span class="ui-icon ui-icon-alert"></span>' + text)
.addClass('StatusError');
}