Проблемы при выполнении ajax-запросов с приложением Phonegap - PullRequest
7 голосов
/ 05 ноября 2011

Я пытаюсь создать простую программу для чтения RSS с Phonegap и jQuery.Я слежу за этим уроком: http://visualrinse.com/2008/09/24/how-to-build-a-simple-rss-reader-with-jquery/.

Мне удалось заставить это работать нормально, когда я пробую код в своем браузере. php-файл выбирает фид и выходные данныеэто так, как я ожидаю. Но когда я запускаю тот же файл из моего скомпилированного приложения Phonegap, ajax-запрос просто возвращает содержимое php-файла (код php, а не выполненный результат).

Я часами гуглил это и пробовал многочисленные уроки и настройки.Я также не нашел решений на официальных форумах PhoneGap.Что я делаю неправильно?Кажется, проблема в том, что PHP не отвечает на запрос.Я пытался переместить php-файл в другой домен, но результат тот же, он работает в моем браузере, но не в скомпилированном приложении.

Вот код jQuery, который инициирует ajax-код:

function get_rss_feed() {
    //clear the content in the div for the next feed.
    $("#feed_content").empty().html('<img class="loader" src="js/images/ajax-loader.gif" alt=""/>');

    $.ajax({
        url: 'http://192.168.1.7/rssApp/www/rss-proxy.php?url=http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml',
        success: function parseRSS(d) {

        //find each 'item' in the file and parse it
        $(d).find('item').each(function() {

            //name the current found item this for this particular loop run
            var $item = $(this);
            // grab the post title
            var title = $item.find('title').text();
            // grab the post's URL
            var link = $item.find('link').text();
            // next, the description
            var description = $item.find('description').text();
            //don't forget the pubdate
            var pubDate = $item.find('pubDate').text();

            // now create a var 'html' to store the markup we're using to output the feed to the browser window
            var html = "<div class=\"entry\"><h2 class=\"postTitle\">" + title + "<\/h2>";
            html += "<em class=\"date\">" + pubDate + "</em>";
            html += "<p class=\"description\">" + description + "</p>";
            html += "<a href=\"" + link + "\" target=\"_blank\">Read More >><\/a><\/div>";

            //put that feed content on the screen!
            $('#feed_content').append($(html));
        });
        $('#feed_content img.loader').fadeOut();
    }

    });

};

Вот rss-proxy.php , который загружает XML из URL и выводит его:

<?php
    // PHP Proxy
    // Loads a XML from any location. Used with Flash/Flex apps to bypass security restrictions
    // Author: Paulo Fierro
    // January 29, 2006
    // usage: proxy.php?url=http://mysite.com/myxml.xml

    $session = curl_init($_GET['url']);                    // Open the Curl session
    curl_setopt($session, CURLOPT_HEADER, false);          // Don't return HTTP headers
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);   // Do return the contents of the call
    $xml = curl_exec($session);                            // Make the call
    header("Content-Type: text/xml");                  // Set the content type appropriately
    echo $xml;        // Spit out the xml
    curl_close($session); // And close the session
?>

Ответы [ 2 ]

15 голосов
/ 07 ноября 2011

Мне наконец-то удалось решить эту проблему! Оказывается, вам нужно добавить в белый список сервер, который вы хотите запросить из приложения PhoneGap в XCode, если вы хотите выполнять запросы к определенному домену (бытьэто ваш localhost или что-то еще).Причина, по которой я не узнал об этом раньше, заключалась в том, что я не проверял ошибки в ответе ajax.После этого я получил http код состояния 401 (не авторизован) и сообщение об ошибке "Whitelist rejected".

Чтобы это исправить, я открыл файл PhoneGap.plist в своем проекте и под ключом ExternalHosts Я добавил новый предмет со значением: *.localhost.Я также изменил URL-адрес ajax:

url: 'http://localhost/rssApp/www/rss-proxy.php?url=http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml'

Я скомпилировал и запустил приложение на iOS Simulator, и мой сервер localhost ответил совершенно успешным ответом ajax!

Для каждого внешнего хоста, к которому вы хотите подключить свое приложение, вы должны добавить его в список ExternalHosts.Например, если вы хотите получить доступ к API на http://google.com/maps/api.php, вы должны добавить *.google.com в свой список.

Вид раздражает, когда вы пытаетесь выяснить, почему сервер не отвечает, ноЯ думаю, это хорошо по соображениям безопасности.Надеюсь, это поможет кому-то еще, кто борется с простыми ajax-запросами из своего приложения PhoneGap!

0 голосов
/ 06 ноября 2011

Похоже, что вы используете свой сервер локально (на основе IP-адреса 192.168.x.x), что означает, что только устройства, подключенные к вашей сети, могут получить к нему доступ. Вы можете временно подключить телефон к той же сети Wi-Fi, что и ваш компьютер. Но вам нужно разместить его на реальном сервере, чтобы он был доступен через Интернет.

Вы также можете перенаправить порт 80 на своем маршрутизаторе на этот IP-адрес, а затем использовать свой фактический IP-адрес (см. Whatsmyip.org) в URL-адресе запроса. Но это не совсем стабильное решение.

...