jquery - 使用PhoneGap和jQuery的跨域请求不起作用

标签 jquery ajax cordova cross-domain

我正在为 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 我可以看到请求的 header 。有一个 OPTIONS 方法,而不是预期的 POST 方法,并添加了一些奇怪的 header 。

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://协议(protocol)。

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

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

已设置。

我已经尝试解决这个问题两天了,但到目前为止还没有结果。这可能吗?您有什么建议可以帮助我继续前进吗?

提前致谢!

最佳答案

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

还知道这在浏览器中不起作用。浏览器存在跨域问题,而不是电话间隙或移动设备。

关于jquery - 使用PhoneGap和jQuery的跨域请求不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173427/

相关文章:

javascript - 使用 JSON 数组中相似键的值创建一个数组

ios - 如何在一段时间后停止 iOS 中的后台服务

jquery - 如何让一个div浮在另一个之上

javascript - 未阻止时无法点击链接

ajax - Extjs 存储加载成功处理程序没有被触发

javascript - Jquery 循环在 Bootstrap 模式中运行两次

jquery - 使用 bootstrap 3 是否可以有多个级别的子菜单?

jquery - 如何在 Web api MVC 6 中启用跨域请求

面向 Cordova 的应用程序 POST cookie session 信息或传递给默认浏览器

cordova - 阻止来源为 "https://www.youtube.com"的框架访问来源为 "file://"的框架