19

我正在为 Android 创建一个 PhoneGap 应用程序。为了从(远程)服务器获取数据,我使用 jQuery 的 $.ajax() 函数进行了 REST 调用。有几件事你必须知道:

  • 调用类型必须是 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 文件的file:// 协议。

在我的 AndroidManifest.xml 文件中,选项

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

已设置。

我正在尝试修复此问题 2 天,但直到现在还没有结果。这甚至可能吗?你有什么建议可以让我继续前进吗?

提前致谢!

4

5 回答 5

10

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

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

于 2012-04-16T15:49:47.740 回答
8

我自己解决了这个问题。问题出在 url 中,我必须在其中添加域。我变了

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

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

它有效!

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

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

于 2012-04-17T10:41:30.757 回答
3

将此添加到 config.xml 救了我

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

我很困惑为什么没有加载任何外部资源,甚至是谷歌地图和我的远程调试工具。这救了我!

于 2016-01-20T20:57:15.000 回答
1

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

或者你可以附加回调=?到您的网址。

于 2012-04-16T13:11:27.410 回答
1

jQuery设置:$.support.cors = true;

于 2013-05-03T06:29:26.583 回答