Phonegap跨域AJAX POST请求在Android上不起作用

Phonegap跨域AJAX POST请求在Android上不起作用,android,jquery,ajax,cordova,cross-domain,Android,Jquery,Ajax,Cordova,Cross Domain,跨域AJAX POST请求在web浏览器(包括移动电话上的浏览器)上运行良好,但不适用于使用Phonegap 我创建了一个登录表单,用户必须输入他们的登录凭据,然后由heroku上托管的服务器验证,如果输入了有效凭据,则返回json{“success”:true} 我的Ajax脚本: $.ajax({ type: "POST", url: "http://domain.com/public/auth/app-login", contentType: "application/x

跨域AJAX POST请求在web浏览器(包括移动电话上的浏览器)上运行良好,但不适用于使用
Phonegap

我创建了一个登录表单,用户必须输入他们的登录凭据,然后由heroku上托管的服务器验证,如果输入了有效凭据,则返回json
{“success”:true}

我的Ajax脚本:

$.ajax({
   type: "POST",
   url: "http://domain.com/public/auth/app-login",
   contentType: "application/x-www-form-urlencoded; charset=utf-8",
   dataType: "json",
   data: {identity: <username from form>, password: <password from form>},
   crossDomain: true,
   cache: false,
   success: function(data) {
       obj = JSON.parse(data);
       if (obj && obj.success === true) {
          window.location.href = 'home.html';
       }
   },
   error: function(e) {
       alert('Error: ' + e.message);
   }
});
$.ajax({
类型:“POST”,
url:“http://domain.com/public/auth/app-login",
contentType:“application/x-www-form-urlencoded;charset=utf-8”,
数据类型:“json”,
数据:{标识:,密码:},
跨域:是的,
cache:false,
成功:功能(数据){
obj=JSON.parse(数据);
if(obj&&obj.success==true){
window.location.href='home.html';
}
},
错误:函数(e){
警报(“错误:”+e.message);
}
});
解决此问题所采取的步骤:

$.ajax({
   type: "POST",
   url: "http://domain.com/public/auth/app-login",
   contentType: "application/x-www-form-urlencoded; charset=utf-8",
   dataType: "json",
   data: {identity: <username from form>, password: <password from form>},
   crossDomain: true,
   cache: false,
   success: function(data) {
       obj = JSON.parse(data);
       if (obj && obj.success === true) {
          window.location.href = 'home.html';
       }
   },
   error: function(e) {
       alert('Error: ' + e.message);
   }
});
  • -config.xml


  • 告诉jQuery允许跨域

$.support.cors=true;

jQuery.support.cors=true;

  • 禁用缓存
    cache:false

非常感谢您的帮助。

好的。如果index.html是本地的,那么您可以在任何主机上调用ajax,而不需要在客户端或服务器上启用CORS。您删除:

$.support.cors = true; OR jQuery.support.cors = true;
以及:


它是多余的,只能使用:

<access origin="*" />

您需要检查并加载AndroidManifest.xml:

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

如果应用程序需要,请添加更多权限。最后,在$(document.ready()中调用ajax:

$.ajax({
类型:“POST”,
url:“http://domain.com/public/auth/app-login",
数据类型:“json”,
数据:{标识:,密码:},
成功:功能(数据){
obj=JSON.parse(数据);
if(obj&&obj.success==true){
window.location.href='home.html';
}
},
错误:函数(e){
警报(“错误:”+e.message);
}
});
使用

JSON.stringify(数据:{identity:,密码:})
而不是
数据:{标识:,密码:}


当我像这样更改代码时,收到了成功消息。

如果您希望解决此问题,那么您可能希望确保插件正确地包含在构建过程中

RESOURCE: \app\config.xml
<widget>
    .... [lots of stuff] ....
    <gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" />
    <access origin="http://*" />
    ....
</widget>

有时在您的域中会出现问题。在我的例子中,我通过在.htaccess文件中添加以下代码来解决它

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

标题集访问控制允许原点“*”

请阅读我写的内容。服务器没有问题,因为它在web浏览器上工作得非常好,在移动电话的浏览器上也是如此。Ok。我明白。您是否从本地应用程序或远程服务器加载index.html(您的应用程序)。若您从远程服务器加载,那个么它也会有上述相同的问题。您是否可以发布服务器的详细错误:访问控制允许来源不允许或…当我在android上以本机方式运行应用程序时,在输入正确的登录凭据后,它会从我的ajax错误命令中抛出一个
错误:undefined
。我不知道这是为什么。对不起。您开发的应用程序类型(Phonegap android或android native)。如果(Phonegap)您的应用程序从本地(www文件夹内)或远程服务器(super.loadUrl(“http://...")). 你能发布你服务器的代码吗?我正在开发一个phonegap应用程序,我用eclipse构建并在android手机上运行它。我有一个
assets
目录,它有
www
,我正在调用
index.html
,因此它是本地的。嗨,你能解决这个问题吗?你能分享解决方案吗?是的,我解决了。尝试以下方法:1。域白名单(),2。使用XMLHttpRequest与服务器通信-请参阅添加
帮助我解决了问题。
RESOURCE: \app\config.xml
<widget>
    .... [lots of stuff] ....
    <gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" />
    <access origin="http://*" />
    ....
</widget>
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
RESOURCE: \app\config.xml
<widget>
     ...
     <feature name="http://api.phonegap.com/1.0/network"/>
     ...
</widget>
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>