问题 Phonegap跨域AJAX POST请求无法在Android上运行


跨域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);
   }
});

解决此问题的步骤:

<access origin="http://domain.com/public/auth/app-login" />

<access origin="*" />

  • 告诉jQuery允许跨域

$.support.cors = true; 要么 jQuery.support.cors = true;

  • 禁用缓存 cache: false

任何帮助表示赞赏。


10068
2017-09-25 10:56


起源

嗨,你能解决这个问题吗?你能分享一下解决方案吗? - Priya Kathir
是的,我确实解决了它。请尝试以下操作:1。域名白名单(docs.phonegap.com/en/2.1.0/...),2。使用XmlHttpReqquest与您的服务器通信 - 请参阅 stackoverflow.com/questions/9464563/... - h4kl0rd


答案:


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

$.support.cors = true; OR jQuery.support.cors = true;

和:

<access origin="http://domain.com/public/auth/app-login" />

它多余,只使用:

<access origin="*" />

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

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

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

$.ajax({
   type: "POST",
   url: "http://domain.com/public/auth/app-login",
   dataType: "json",
   data: {identity: <username from form>, password: <password from form>},
   success: function(data) {
     obj = JSON.parse(data);
     if (obj && obj.success === true) {
        window.location.href = 'home.html';
     }
   },
   error: function(e) {
     alert('Error: ' + e.message);
   }
});

7
2017-09-26 01:41



请阅读我写的内容。服务器没有任何问题,因为它在Web浏览器上工作得非常好,也适用于手机浏览器。 - h4kl0rd
好。我明白那个。您是否从本地应用程序或远程服务器加载index.html(您的应用程序)。如果从远程服务器加载,那么它将具有上述相同的问题。你可以从服务器发布详细错误:不允许访问控制允许 - 来源或... - Hanh Le
当我在android上本机运行应用程序时,在输入正确的登录凭据后,它会抛出一个 error: undefined 来自我的ajax错误命令。我不知道为什么会这样。 - h4kl0rd
抱歉。你开发了什么样的应用程序(Phonegap android或android native)。如果(Phonegap)您的应用程序从本地(www文件夹内)或远程服务器(supper.loadUrl(“http:// ...”))加载index.html。你可以发布服务器的代码吗? - Hanh Le
我正在开发一个我用eclipse构建的phonegap应用程序,并在Android手机上本机运行。我有一个 assets 有的目录 www 而我正打电话给 index.html,所以它是本地的。 - h4kl0rd


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

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

您可能还希望指定一个推荐的版本,我没有在上面指定一个版本。测试插件是否包含的一个好方法是使用提供的免费云帐户, https://build.phonegap.com/apps。如果您在那里构建项目,则可以检查插件选项卡并确保包含白名单插件。

我已经读过你应该只在你的HTML页面的HEAD元素中需要这个,但我发现截至本文的日期,我仍然需要包含该插件。

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

如果未加载插件,则在使用时可能会出现“未找到”错误 $.ajax jQuery的错误字符串的方法。

互联网上的一些信息将告诉您白名单信息被放入 /www/res/ 文件夹,但这似乎是过时的信息。你也可以找到 <plugin... 在某些示例中使用,但似乎这可能是一种过时的方式?

此外,您可能需要:

RESOURCE: \app\config.xml
<widget>
     ...
     <feature name="http://api.phonegap.com/1.0/network"/>
     ...
</widget>

3
2017-10-07 18:54



加入 <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> 帮我解决了这个问题。 - Farzad YZ


使用

JSON.stringify(data: {identity: <username from form>, password: <password from form>}) 

代替 data: {identity: <username from form>, password: <password from form>}

当我改变我的代码时,我得到了成功的消息。


1
2018-04-21 05:06





有些时候您的域名存在问题。在我的情况下,我通过在我的.htaccess文件中放入以下代码来解决它

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

-1
2017-11-26 13:43