在 PhoneGap+jQuery Mobile 中使用 ajax 的 CORS 无法在设备上运行,但在浏览器上运行

Posted

技术标签:

【中文标题】在 PhoneGap+jQuery Mobile 中使用 ajax 的 CORS 无法在设备上运行,但在浏览器上运行【英文标题】:CORS using ajax within PhoneGap+jQuery Mobile not working on device but is on browsers 【发布时间】:2013-01-08 15:58:56 【问题描述】:

所以我正在使用 Phone Gap 和 jQuery mobile 构建一个应用程序。

当使用 ajax 从白名单服务器获取 json 响应时,我收到错误响应。但是,控制台中没有显示任何内容。奇怪的是,当在网络浏览器中测试应用程序时它工作正常,只有当我启动到我的 iPhone 设备时,它才会抛出一个 strop。

现在值得一提的是,我托管我的 php 脚本的网站在 Phone Gap 中被列入白名单。我在数组中使用 * (以防万一这会有所不同)。 我已经为此制定了一个 jsonp 解决方法,但不想使用它 - 我觉得如果它在浏览器中工作,它必须在设备上是可能的。我希望这是一个简单的修复...

这是我的简单 php 脚本,它只是回显了一个 json 字符串。

<?php
header('Access-Control-Allow-Origin: *');
$arr = array('a' => 1, 'b' => 2);
echo json_encode($arr);
?>

这里是 JS

    $('#registerUser').submit(function() 
          $.ajax(
                 url: 'http://www.mydomain.co.uk/path/register/add_user.php',
                 type: 'post',
                 dataType: 'json',
                 crossDomain : true,
                 timeout: 5000,
                 success: function(msg)
                    alert(msg.a);
                 ,
                 error: function()
                    alert('There was an error loading the data.');
                 
                 );
          );
    );

编辑:我在页面上也有这个 js...在 jquery mobile docs 上建议在使用 Phone Gap 时使用它

        <script>
        $( document ).on( "mobileinit", function() 

            $.mobile.allowCrossDomainPages = true;
            $.support.cors = true;
        );

        </script>

还有表格——我认为没有必要……

           <form id='registerUser' action="" method="POST">
                <div data-role="fieldcontain">
                    <label for="name">Name:</label>
                    <input type="text" name="name" id="name" value=""  />
                    <label for="name">Email:</label>
                    <input type="text" name="email" id="email" value=""  />
                    <label for="name">Password:</label>
                    <input type="password" name="password1" id="password1" value=""  />
                    <label for="name">Re-enter password:</label>
                    <input type="password" name="password2" id="password2" value=""  />
                    <br>
                    <button type="submit" aria-disabled="false">Submit</button>
                </div>
            </form>

提前感谢您的帮助!

【问题讨论】:

能否附上您收到的错误信息? ajax 函数中的错误信息。不是特定的 js 错误。 【参考方案1】:

尝试最简单的方法是使用以下内容扩充您的 PHP 服务器:

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET,PUT,POST,DELETE');
header('Access-Control-Allow-Headers: Content-Type');
$arr = array('a' => 1, 'b' => 2);
echo json_encode($arr);
?>

您还需要确保您的 PHP 服务器允许 OPTIONS HTTP 请求。

更长的答案是您的 JS 代码中的 dataType: 'json' 正在触发 CORS 预检请求。预检请求基本上要求服务器允许发出实际请求。您可以在此处了解有关 CORS 预检的更多信息:http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

嘿。我尝试添加那些额外的标题,但没有奏效。仍然在 ajax 请求中遇到错误语句。【参考方案2】:

我遇到过Access-Control-Allow-Origin: * 实际被客户端忽略的情况。我相信通过CORS允许所有域的“正确”方式(参见the w3c spec to confirm this)实际上是从请求标头中获取源域,然后将该源动态应用于响应的Access-Control-Allow-Origin标头,而不是使用通配符,以确保客户端尊重标头。

【讨论】:

我该怎么做?【参考方案3】:

好的,事实证明代码没有问题。似乎该应用程序正在缓存错误结果或其他东西。我杀死了该应用程序并重新启动它,现在一切正常。从周围阅读看来,ios6 safari 缓存 POST,这与以前的版本不同。

我在我的 ajax 调用中添加了这个以防止缓存 POST。

 headers:  "cache-control": "no-cache" 

我希望这对其他人有帮助,因为它一直很痛苦!

感谢回复

【讨论】:

我也遇到了同样的问题,你能看看这里吗:***.com/questions/22582456/…【参考方案4】:

我在这个问题上的经历被证明是由于我使用带有“无效”SSL 证书的 httpS 造成的。 iPhone 移动 safari 和 webview 不信任 SSL 证书,因此没有发出 AJAX 请求。

我能够通过临时使用纯 HTTP 来完成开发。

我的 CORS 标头是:

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With,Authorization

【讨论】:

以上是关于在 PhoneGap+jQuery Mobile 中使用 ajax 的 CORS 无法在设备上运行,但在浏览器上运行的主要内容,如果未能解决你的问题,请参考以下文章

在“PhoneGap + jQuery Mobile”应用程序中正确注册事件

一起使用 JQuery-Mobile/Phonegap 的正确方法?

带有 phonegap 的 Jquery mobile 不适用于移动应用程序

jQuery mobile 停止在同一页面中使用 iFrame - Phonegap

导航Jquery Mobile + PhoneGap

防止放大Phonegap + JQuery Mobile