2012-03-20 102 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