JQuery mobile + Phonegap: вызовы Ajax не работают на эмуляторе Android - PullRequest
9 голосов
/ 29 июня 2011

У меня мобильное веб-приложение, созданное с использованием следующих версий: -

  1. JQuery Mobile: Alpha 4 v1.0a4.1
  2. JQuery: v1.6.1
  3. PhoneGap: v0.9.5

Используя 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 и ошибка, кажется, указывает на то, что эти два не смешиваются !! Если это действительно так, как мне выполнить вызовы ajax из развернутого приложения phonegap?

Пожалуйста, не стесняйтесь указывать на что-нибудь еще, что может быть полезным! Я довольно озадачен на этом этапе.

Редактировать: Я проверил файл AndroidManifest.xml, и все разрешения согласно этой вики-ссылке установлены в этом файле.

Редактировать 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 ]

11 голосов
/ 28 июля 2011

Эмулятор Android не распознает "localhost" ... он должен быть 10.0.2.2. попробуйте изменить URL-адрес на http://10.0.2.2:2424/MyServer/RetrieveMasterData.aspx

2 голосов
/ 29 декабря 2011

Поскольку запрос не в том же домене, и я решил проблему, добавив 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

0 голосов
/ 11 августа 2013

Другая проблема, которая возникает в Android 4.0+ (но не в более старых версиях, таких как 2.3) ... касается вызовов ajax, которые требуют Basic Auth. Вы должны вручную установить заголовок авторизации в beforeSend. Вы не можете использовать новое имя пользователя: пароль: опции, добавленные в jQuery 1.7.

Пример ниже иллюстрирует, что вы должны сделать. Примечание. Для этого требуется подключаемый модуль jquery base64.

 $.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) {

            }
        });
...