2013-07-31 31 views
2

我正在開發一個移動應用程序,使用PhoneGap,我必須從另一個項目訪問一些服務。 我正在使用jquery-2.0.0.jsjquery-mobile-1.3.2.jsPhoneGap阿賈克斯呼叫每次都失敗

$.ajax({ 
      url: 'http://localhost:62465/api/[email protected]', 
      dataType: 'json', 
      success: function (data) { 
       alert(data.Name); 
      }, 
      error: function (xhr, type) { 
       alert("Failed to load data"); 
       alert(xhr + " " + type); 
      } 
}); 

這個ajax調用每次都會失敗。在config.xml我有以下行:<access origin="*" />

我哪裏可能會出錯!

回答

8

問題是,你的phonegap應用程序正在請求一個非web服務器的本地文件。本地文件與NO HTTP HEADERS一起交付 - 這意味着沒有「200 OK」標題,也沒有「404 Not Found」錯誤。因此,狀態碼被假定爲0.

Straight javascript XHR將需要忽略狀態並在readystate == 4(已完成並準備就緒)上執行您的操作。就像這樣:

var myrequest = new XMLHttpRequest(); 
    myrequest.open('GET','localfile.html'); 
    myrequest.onreadystatechange = function(){ 
     if(myrequest.readyState == 4) { 
      var result = myrequest.responseText; 
     } 
    } 
    myrequest.send(); 

在MooTools的,它在Request類實現改變狀態測試的相對簡單的任務 - 改變返回碼測試真也接受0。就像這樣:

Request.implement({ 
    isSuccess: function(){ 
     var status = this.status; 
     return ((status >= 200 && status < 300) || status === 0); 
    } 
}); 

jQuery的....我有一些事情,我想談談jQuery的 - 但我會堅持我的舌頭,因爲這似乎是一個優雅的地方。

要爲狀態== 0準備jQuery,您需要使用always事件而不是成功事件,您可以在那裏測試狀態代碼。

$.ajax({ 
    url: '/echo/html/', 
    type: 'PUT', 
    data: "[email protected]" 
}).always(function(data, textStatus, jqXHR){ 
    switch(textStatus) { 
    case 200: 
     case 0: 
     alert('Success.'); 
      break; 
     case 404: 
      alert('oops'); 
      break; 
    } 
}); 

Ajax in Cordova/Phonegap - Yay!

+0

讓我試試。如果這適用於我的mootools項目,我會給你100賞金 –

0

您正在使用物理設備還是仿真器? iOS? Android?

我可能是錯的,但如果您在移動設備上運行您的應用程序,則無法訪問您的本地主機。

+0

我正在使用物理設備(Android)和模擬器。 我不確定我是否可以訪問localhost,但如果我不能,我該怎麼辦? –

+0

正如@Lixas所說,嘗試使用IP或將您的php文件上傳到可通過URL訪問的服務器。 你的計算機上運行着哪個服務器? WAMP? – David

+0

我沒有任何php文件,我在同一個解決方案中有一個ASP.NET Web API項目和PhoneGap項目。 –

2

查詢的網址是localhost,thant的意思是相同的設備(android模擬器或物理)。我相信這是你的問題。您應該使用您的api json服務器的IP(或域名),也許192.168.1.1(取決於您的網絡配置)

+0

我現在正在嘗試這個,我會回來的答案。 –

+0

我試過了,但不起作用。新的網址是http://192.168.101.255:62465/api/account。 –

+0

您可以從其他位置訪問該服務器嗎?可能某種防火牆值班並阻止訪問 – Lixas

0

我解決了「GET」調用的問題,但現在我試圖做一個「PUT 「電話,這是同樣的問題,總是失敗。

$.ajax({ 
    url: '/echo/html/', 
    type: 'PUT', 
    data: "[email protected]", 
    success: function(data) { 
     alert('Success.'); 
    } 
}); 
0

如果您的手機無法訪問url: 'http://localhost:62465/api/[email protected]',則可以使用非常有用的技巧。

使用www.ngrok.com,您可以將互聯網域分配給您的本地不可訪問的端口。

剛剛註冊,獲得訪問令牌,然後你可以使用: ngrok -authtoken myauthtoken -subdomain=mysubdomainname 62465

然後你就可以通過URL http://mysubdomainname.ngrok.com/api/[email protected]

-1

訪問您的計算機(對於有着相近問題的人) 使用Ajax錯誤知道什麼是錯的:

error: function(jqXHR, exception){   
     var msg = ''; 
     if (jqXHR.status === 0) { 
      msg = 'Not connect.\n Verify Network.'; 
     } else if (jqXHR.status == 404) { 
      msg = 'Requested page not found. [404]'; 
     } else if (jqXHR.status == 500) { 
      msg = 'Internal Server Error [500].'; 
     } else if (exception === 'parsererror') { 
      msg = 'Requested JSON parse failed.'; 
     } else if (exception === 'timeout') { 
      msg = 'Time out error.'; 
     } else if (exception === 'abort') { 
      msg = 'Ajax request aborted.'; 
     } else { 
      msg = 'Uncaught Error.\n' + jqXHR.responseText; 
     } 
     console.log(msg); 
    }