2013-07-31 32 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); 
    }