jQuery ajax - 绝对URL和错误处理

时间:2012-03-20 16:21:02

标签: javascript jquery

当我们通过指定绝对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);
              }
});

3 个答案:

答案 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个回调。)