2012-04-16 72 views
19

我正在为Android创建PhoneGap应用程序。要从(远程)服务器获取数据,我使用jQuery的$ .ajax()函数进行REST调用。有几件事你必须知道:使用PhoneGap和jQuery的跨域请求不起作用

  • 呼叫的类型必须为POST
  • 服务器期待JSON数据(至少用户名和密码)
  • 服务器返回JSON数据

代码:

function makeCall(){ 
    var url = "http://remote/server/rest/call"; 

    var jsonData ='{"username":"'+$('#username').val()+'","password":"'+$('#password').val()+'"}'; 

    $.ajax({ 
      headers: {"Content-Type":"application/json; charset=UTF-8"}, 
      type: "POST", 
      url: url, 
      data: jsonData, 
      dataType: "json", 
      success: succesFunction, 
      error: errorFunction 
    }); 
} 

但是,这是行不通的。当我使用Firebug查看服务器响应时,什么也没有。使用TcpTrace,我可以看到请求的标题。而不是预期的POST方法,有一个OPTIONS方法,添加了一些奇怪的头文件。

OPTIONS /remote/server/rest/call HTTP/1.1 
Host: localhost:8081 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: nl,en-us;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Origin: null 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Pragma: no-cache 
Cache-Control: no-cache 

我知道它与做跨域请求有关,但我不知道如何解决问题。我试了几件事情要修复它,但没有结果:

的问题也有事可做具有相同的原始策略,但是这不适用于文件://协议PhoneGap用于加载本地html文件。

在我的AndroidManifest.xml文件,

<uses-permission android:name="android.permission.INTERNET" /> 

设置的选项。

我试图解决这个问题2天,但现在没有结果。这甚至有可能做到吗?你有任何提示给我,所以我可以继续前进吗?

在此先感谢!

回答

8

我自己解决了这个问题。问题位于url,我必须添加一个域。我改变

var url = "http://remote/server/rest/call";

var url = "http://remote.mydomain.com/server/rest/call";

和它的作品!

我认为第一个url应该可以工作,因为它可以在iphone应用上使用完全相同的url和设置。它也与我关闭Windows防火墙的双重防火墙(Windows和ESET防火墙)有关。

无论如何,谢谢你的回答!

+0

您的问题可能已修复,但这不是解决跨域请求问题的答案 – Asqan 2015-09-10 12:15:18

0

尝试设置dataType:jsonp并设置crossDomain:true 对于跨域的ajax请求,您可以使用jsonp。 http://api.jquery.com/jQuery.ajax/

或者你可以追加回叫=?到你的网址。

+0

我已经尝试了你的建议,但它不起作用。仍然是同样的问题。感谢您的回答。 – weerd2 2012-04-16 13:30:03

+2

JSONP不会替代一个跨域POST – contactmatt 2013-06-03 15:17:38

10

您需要将您的外部域名列入白名单。只需在xcode中找到您的phonegap/cordova plist文件并添加一个新条目,它的价值是*,您可以访问任何网站。

也知道这不会在浏览器中工作。浏览器存在跨域问题,而不是手机或移动设备。

+1

其实它可能在Safari中工作,如果你通过'file://加载,但Chrome和FF是不行的... – Devgeeks 2012-04-17 06:52:43

+7

你可以让它工作在铬禁用网络安全。在Windows中运行>'chrome --disable-web-security' 在Mac OS中> sudo/Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --disable-web-security --enable-geolocation ' – Peter 2012-04-17 07:09:11

+0

感谢您的反应,但它仍然无法正常工作。当请求完成时仍然运行错误功能。我认为这与服务器设置有关。我现在会看看它,让你保持最新! – weerd2 2012-04-17 08:00:43

1

JQuery设置:$。support.cors = true;

3

添加此到config.xml救了我

<gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" version="1.1.1" /> 
<access origin="*" /> 
<allow-navigation href="*" /> 
<allow-intent href="*" /> 

我百思不得其解,为什么任何外部资源没有加载,甚至谷歌地图和我的远程调试工具。这救了我!

+0

这真的很有帮助! – Schiavini 2016-02-11 12:40:05