JQuery mobile + Phonegap:Ajax调用无法在Android Emulator上运行

时间:2011-06-29 09:16:54

标签: jquery ajax jquery-mobile cordova

我有一个使用以下版本构建的移动Web应用程序: -

  1. JQuery Mobile:Alpha 4 v1.0a4.1
  2. JQuery:v1.6.1
  3. PhoneGap:v0.9.5
  4. 使用phonegap,此应用程序内置于本机Android应用程序中并进行部署。

    在我的应用程序中,我使用$ .ajax对外部网站进行各种AJAX调用。 为此,我使用dataType:'jsonp'以进行跨域调用。

    当我在Chrome v12.0.742.100中测试我的应用时,一切正常,我从外部网站检索数据时没有任何问题。但是,只要我将其打包成.apk文件并尝试在模拟器中运行它,我就会发现没有任何ajax调用正在运行。

    我已经在ajax调用之前和之后发出警报并验证了两个警报都已被调用,但是ajax调用与忽略一样好。我已经登录成功回调和错误回调,但都没有到达。我还通过在外部服务器网站上设置断点来验证(对于我的测试,我只是在我的本地计算机本身上有一个单独的网站)并且服务器页面肯定没有被调用。

    在logcat中,我能看到的错误是这样的: D / SntpClient(59):请求时间失败:java.net.SocketException:协议不支持的地址族

    我对phonegap和Jquery Mobile都很陌生,但就我的理解而言,我的phonegap应用程序文件由 file:/// 协议引用,而我的AJAX URL为 http://127.0.0.1:someport/someapp/somepage ,错误似乎表明这两个不要混合!!如果情况确实如此,我该如何从已部署的phonegap应用程序进行ajax调用?

    请随意指出其他可能有用的内容!我现在很难过。

    编辑:我已检查AndroidManifest.xml文件,并且此文件中设置了此phonegap wiki link的所有权限。

    编辑2:在我的客户端代码中添加引发ajax调用的代码

    var serverUrl = "http://localhost:2424/MyServer/RetrieveMasterData.aspx";
                $.ajax({
                    url: serverUrl,
                    type: 'POST',
                    dataType: 'jsonp',
                    data: { MasterDataID: 1 },
                    success: function(response) {
                            ...... business logic here
                    },
                    error: function(xhr, ajaxOptions, thrownError) {
                            ...... error handling something here
                    }
                });
    

3 个答案:

答案 0 :(得分:11)

Android模拟器无法识别“localhost”...它应该是10.0.2.2。 尝试将网址更改为 http://10.0.2.2:2424/MyServer/RetrieveMasterData.aspx

答案 1 :(得分:2)

因为请求不在同一个域中,我通过添加jqm config来解决问题:

$( document ).bind( "mobileinit", function() {
  // Make your jQuery Mobile framework configuration changes here!

  $.mobile.allowCrossDomainPages = true;
});

这是一个链接:http://jquerymobile.com/demos/1.0/docs/pages/phonegap.html

答案 2 :(得分:0)

Android 4.0+中出现的另一个问题(但不是2.3版本的旧版本)...适用于需要Basic Auth的ajax调用。您必须在beforeSend中手动设置授权标头。您不能使用新的用户名:密码:jQuery 1.7中添加的选项。

以下示例说明了您需要做的事情。 注意:这需要base64 jquery插件。

 $.ajax({
            url: "https://yoururl,
            type: method,
            dataType: 'json',
            // username: username,  // Doesn't work on ANDROID
            // password: password,  // Doesn't work on ANDROID
            beforeSend: function (xhr)
            {
                xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode( username + ":" + password ));
            },
            data: options.data,
            success: function(response) {

            },
            error: function(jqXHR, textStatus, errorThrown) {

            }
        });