当我们通过指定绝对URL来调用外部Web服务时,是否可以捕获HTTP错误(如404,500,504等)。 (例如设置url:
调用的$.ajax
属性,将网址值设为http://api.geonames.org/findNearbyPostalCodes
。
现在我无法收到任何错误,尽管firebug正在抓住它们并在控制台中显示它。
有人可以帮忙吗?
这是我的代码。
$.ajax({
type: 'GET',
url: "http://api.geonames.org/findNearbyPostalCodes",
data: '{"lat":47,"lng":"9","username":"demo"}',
dataType: 'json',
cache:false,
async:false,
statusCode:{
404: function(){
alert('Page not found');
},
500: function(){
alert('Page not found');
},
504: function(){
alert('Unknown host');
}
},
success: function(data){
alert(data);
}
error: function (xhr, exception, thrownError)
{
alert(xhr.status);
}
});
答案 0 :(得分:2)
不,仅使用客户端代码的跨域(外部)请求是不可能的。这是因为跨域请求依赖于JSONP - 即,注入一个从外部源加载代码的脚本标记。不幸的是,<script>
元素没有onerror
事件。
您可以处理相同域请求的错误,因为它们通常使用XMLHttpRequest
,它会返回许多有用的信息,如状态代码和响应标头。
您最好的选择是使用本地服务器作为代理。
答案 1 :(得分:0)
如果使用绝对URL会导致域与您的页面域(跨域请求)不同,那么成功执行ajax调用的唯一方法是使用JSONP这将导致ajax库使用<script>
标记用于跨域请求,而不是用于同域请求的更典型的XMLHttpRequest。
您无法通过加载跨域<script>
代码拦截任何类型的状态代码。
答案 2 :(得分:0)
在您的情况下,您无法检查状态代码(假设您没有从api.geonames.org提出请求)。
如果请求是跨域的,jQuery将始终返回“0”状态:
$.ajax({
type: 'GET',
url: 'http://someotherdomain.com/api/query',
dataType: 'json',
data: '{"first": 1, "second": 2}',
complete: function(response) { // the 'response' object has the status code
if (response.status == '200') {
// do something on success
} else if (response.status == '0') {
alert('Your request is cross-domain');
}
}
});
如果请求恰好位于同一个域中,您将获得一个可以检查的有效状态代码(complete
函数的$.ajax()
属性将在任何{{1}之后运行运行{或success
个回调。)