2012-03-20 55 views
1

当我们通过指定绝对url调用外部web服务时,是否有可能捕获HTTP错误(如404,500,504等)? (比如设置$.ajax呼叫url:属性有一个URL值http://api.geonames.org/findNearbyPostalCodesjQuery ajax - 绝对URL和错误处理

现在我无法虽然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); 
       } 
}); 
+1

是否正在执行错误块的警报? – 2012-03-20 16:24:16

+1

成功回调后,您错过了逗号 – bevacqua 2012-03-20 16:25:47

+0

错误回调或错误复制/粘贴之前缺少逗号? – soju 2012-03-20 16:27:44

回答

2

不,这是不可能的跨域(外部)只使用客户端代码的请求。这是因为跨域请求依赖JSONP - 即注入一个脚本标记,从外部源加载代码。不幸的是,<script>元素没有任何东西像onerror事件。

,因为这些通常使用XMLHttpRequest,返回了很多像状态码和响应头有用的信息,您可以处理与同域请求错误。

最好的办法是使用本地服务器作为代理。

+0

这意味着在使用JSONP的时候,我们可能无法拥有一个错误处理程序吗? – 2012-03-21 08:45:25

+0

@david - 是的,您无法为JSONP请求设置错误处理程序 – gilly3 2012-03-21 14:39:30

0

如果使用绝对URL导致域与页面域不同(跨域请求),那么成功执行ajax调用的唯一方法是使用JSONP这将导致ajax库使用<script>用于跨域请求的标记,而不是用于相同域请求的更典型的XMLHttpRequest。

您将无法从跨域<script>标签的装载拦截任何类型的状态码。

+0

感谢您的回复,我能够看到在萤火虫控制台中有适当的错误吗?有没有一种方法可以抓住它们并在我的应用程序中将它们显示为警报? – 2012-03-21 08:46:51

+0

@DavidR - 不是我所知道的 – jfriend00 2012-03-21 09:52:00

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'); 
     } 
    } 
}); 

如果请求恰好是同一个域中,你会得到一个有效的状态代码您可以检查($.ajax()函数的complete属性将在任何successfailure回调运行后运行)。

+0

感谢Joe!..但是我能够看到萤火虫控制台中的适当的错误?有没有办法我可以抓住这些并在我的应用程序中显示它们为警报? – 2012-03-21 08:46:36

+0

@DavidR是的,我很确定Firebug中的状态代码与状态代码完全分开,我们将通过AJAX以编程方式接收(如通过快速Google搜索显示的一些示例)。 – JoeLinux 2012-03-21 12:04:20

+0

您最好的解决方法是使用JSONP,尽管这有一些限制(如@ gilly3所述)。我将从本地域的服务器端访问,然后使用AJAX将结果正确地提交给客户端。 – JoeLinux 2012-03-21 12:07:44