Php 使用Phonegap应用程序执行ajax请求时出现问题

Php 使用Phonegap应用程序执行ajax请求时出现问题,php,jquery,ajax,rss,cordova,Php,Jquery,Ajax,Rss,Cordova,我正在尝试使用Phonegap和jQuery创建一个简单的RSS阅读器。 我将遵循以下教程: 当我在浏览器中尝试代码时,我成功地使其正常工作。php文件获取提要并输出它,就像我期望的那样但是当我在编译的Phonegap应用程序中运行同一个文件时,ajax请求只返回php文件的内容(php代码,而不是执行的结果) 我花了几个小时在谷歌上搜索这个,并尝试了许多教程和调整。我在官方的Phonegap论坛上也没有找到解决方案。我做错了什么?问题似乎是PHP没有响应请求。我尝试将php文件移动到不同的域,

我正在尝试使用Phonegap和jQuery创建一个简单的RSS阅读器。 我将遵循以下教程:

当我在浏览器中尝试代码时,我成功地使其正常工作。php文件获取提要并输出它,就像我期望的那样但是当我在编译的Phonegap应用程序中运行同一个文件时,ajax请求只返回php文件的内容(php代码,而不是执行的结果)

我花了几个小时在谷歌上搜索这个,并尝试了许多教程和调整。我在官方的Phonegap论坛上也没有找到解决方案。我做错了什么?问题似乎是PHP没有响应请求。我尝试将php文件移动到不同的域,但结果是相同的,它在我的浏览器中工作,但在已编译的应用程序中不工作

以下是启动ajax代码的jQuery代码:

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();
    }

    });

};
函数get\u rss\u feed(){ //为下一个提要清除div中的内容。 $(“#提要内容”).empty().html(“”); $.ajax({ 网址:'http://192.168.1.7/rssApp/www/rss-proxy.php?url=http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml', 成功:函数解析RSS(d){ //找到文件中的每个“项”并对其进行分析 $(d).find('item').each(function(){ //为此特定循环运行命名当前找到的项 变量$item=$(此项); //抢占职位 var title=$item.find('title').text(); //抓取帖子的URL var link=$item.find('link').text(); //接下来是描述 var description=$item.find('description').text(); //别忘了出版日期 var pubDate=$item.find('pubDate').text(); //现在创建一个var“html”来存储用于将提要输出到浏览器窗口的标记 var html=”“+title+”; html+=“”+pubDate+“”; html+=“

“+description+”

”; html+=“阅读更多>>”; //把那个提要内容放到屏幕上! $('#feed_content')。追加($(html)); }); $('#feed_content img.loader').fadeOut(); } }); }; 下面是从url加载XML并输出的rss proxy.php

<?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
?>

看起来您正在本地运行服务器(基于192.168.x.x IP地址),这意味着只有连接到网络的设备才能访问它。您可以临时将手机连接到与计算机相同的wifi网络。但是你需要把它放在一个真正的服务器上,这样才能通过互联网访问它


您还可以将路由器上的端口80转发到此IP地址,然后在您的请求url中使用您的实际IP地址(请参阅whatsmyip.org)。但这不是一个真正稳定的解决方案。

我终于设法解决了这个问题 事实证明,如果您想向某个域(无论是您的本地主机还是其他)发出请求,您需要在Xcode中将您希望从PhoneGap应用程序请求的服务器列为白名单。 我之前没有发现这一点的原因是我没有检查ajax响应中的错误。一旦我这样做了,我就得到了http状态代码
401
(未经授权)和错误消息“
白名单被拒绝”

为了解决这个问题,我在项目中打开了文件
PhoneGap.plist
,并在键
ExternalHosts
下添加了一个值为:
*.localhost
的新项。 我还将ajax url更改为:

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

我在iOS模拟器上编译并运行了应用程序,我的localhost服务器做出了非常成功的ajax响应

对于希望应用程序连接到的每个外部主机,必须将其添加到
ExternalHosts
列表中。例如,如果您希望访问上的API,则必须将
*.google.com
添加到列表中


当你试图弄清楚为什么服务器没有响应时,有点烦人,但我想出于安全考虑,这是个好办法。希望这能帮助那些正在努力处理来自PhoneGap应用程序的简单ajax请求的人

我建议从代码中删除该ip地址。从模拟器或设备的浏览器中打开
.php
文件时会发生什么?PHP被执行了吗?谢谢你的评论!我试着从模拟器的浏览器中访问
.php
文件,效果很好。但只有当我将URL更改为相对而非绝对时,它才会起作用:
URL:'rss proxy.php?URL=http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml“
。如果我现在使用mobile Safari浏览器访问Phonegap应用程序www文件夹中的index.html文件,该应用程序位于我的
htdocs
目录下的本地MAMP服务器上,它会工作!但并非来自已编译的Phonegap应用程序。当然,
.php
文件与其他脚本文件一起位于www文件夹中。感谢Jason的回复!但是,我尝试将php脚本上传到另一个由web酒店托管的外部LAMP服务器,并在ajax请求中更改了url,但这也不起作用。但在我的浏览器中,这种解决方案仍然有效。我在谷歌搜索时不断发现的解决方案是,它不应该比在任何服务器端脚本中键入任何URL更难,而且应该可以工作:例如:
ajax.open(“GET”http://search.twitter.com/search.json?q=bacon“,对)但我无法让它工作。顺便说一下,我使用的是iOS模拟器,而不是在物理手机上运行应用程序。这应该不是一个问题,但是,我可以从模拟器中的mobile Safari浏览器访问所有服务器