【问题标题】:Cross-domain requests using PhoneGap and jQuery doesn't work使用 PhoneGap 和 jQuery 的跨域请求不起作用
【发布时间】:2012-04-27 17:48:06
【问题描述】:

我正在为 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 天,但直到现在还没有结果。这甚至可能吗?你有什么建议可以让我继续前进吗?

提前致谢!

【问题讨论】:

    标签: jquery ajax cordova cross-domain


    【解决方案1】:

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

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

    【讨论】:

    • 其实...如果您通过file:// 加载它可能会在 Safari 中工作,但 Chrome 和 FF 是不行的...
    • 您可以通过禁用网络安全使其在 chrome 中运行。在 Windows 中运行 > chrome --disable-web-security 在 Mac OS 中 &gt; sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-web-security --enable-geolocation
    • 感谢您的反应,但仍然无法正常工作。请求完成后仍然会运行错误函数。我认为这与服务器设置有关。我现在会看一下,让您了解最新情况!
    【解决方案2】:

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

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

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

    它有效!

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

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

    【讨论】:

    • 您的问题可能已解决,但这不是解决跨域请求问题的答案
    【解决方案3】:

    将此添加到 config.xml 中救了我

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

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

    【讨论】:

    • 这真的很有帮助!
    【解决方案4】:

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

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

    【讨论】:

    • 我已经尝试过您的建议,但它不起作用。还是同样的问题。谢谢你的回答。
    • JSONP 不能替代跨域 POST
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2014-04-18
      相关资源
      最近更新 更多