2011-11-05 18 views
7

Estoy tratando de crear un lector de RSS simple con Phonegap y jQuery. Estoy siguiendo este tutorial: http://visualrinse.com/2008/09/24/how-to-build-a-simple-rss-reader-with-jquery/.Problemas al hacer solicitudes ajax con una aplicación Phonegap

He logrado que esto funcione perfectamente cuando pruebo el código en mi navegador. El archivo php recupera el feed y lo genera tal como lo esperaba. Pero cuando ejecuto el mismo archivo desde mi aplicación Phonegap compilada, la solicitud ajax simplemente devuelve el contenido del archivo php (el código php, no el resultado ejecutado).

He pasado horas buscando en Google esto y he probado numerosos tutoriales y ajustes. Tampoco encontré soluciones en los foros oficiales de Phonegap. ¿Qué estoy haciendo mal? El problema parece ser que PHP no responde a la solicitud. Intenté mover el archivo php a un dominio diferente pero el resultado es el mismo, funciona en mi navegador pero no en la aplicación compilada.

Aquí está el código jQuery que inicia el ajax-código:

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

    }); 

}; 

Aquí está la RSS-proxy.php que carga el XML de la URL y la emite:

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

Aconsejo eliminar esa dirección IP del código. – sciritai

+0

¿Qué sucede cuando abre el archivo '.php' desde el navegador en el simulador o dispositivo? ¿El PHP se ejecuta? – Marko

+0

¡Gracias por los comentarios! Intenté acceder al archivo '.php' desde el navegador en el simulador y funciona. Pero solo funciona si cambio la URL para que sea relativa, no absoluta: 'url: 'rss-proxy.php? Url = http: //www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml' '. Si ahora uso el navegador Safari móvil para visitar el archivo index.html en mi carpeta www de mi aplicación Phonegap que estoy hospedando en mi servidor MAMP local en mi directorio 'htdocs' ¡funciona! Pero no de la aplicación Phonegap compilada. Y, por supuesto, el archivo '.php' se encuentra en la carpeta www junto con los otros archivos de script. – user1029978

Respuesta

15

¡Finalmente he logrado resolver esto! Resulta que debe incluir en la lista blanca el servidor que desea solicitar desde su aplicación PhoneGap en Xcode si desea hacer solicitudes a un determinado dominio (ya sea su servidor local o lo que sea). La razón por la que no descubrí esto antes fue porque no verifiqué los errores en la respuesta de Ajax. Una vez que hice eso, obtuve el código de estado http 401 (no autorizado) y el mensaje de error "Whitelist rejected".

Para solucionar este Abrí el archivo PhoneGap.plist en mi proyecto y en la clave ExternalHosts he añadido un nuevo elemento con el valor: *.localhost. También ha cambiado la URL ajax a:

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

me compilar y ejecutar la aplicación en el simulador de iOS y mi servidor localhost respondieron con una respuesta exitosa a la perfección ajax!

Para cada host externo que desee que su aplicación se conecte debe agregarlo a la lista de ExternalHosts. Por ejemplo, si desea acceder a una API en http://google.com/maps/api.php, debe agregar *.google.com a su lista.

Es un poco molesto cuando tratas de entender por qué el servidor no responde, pero supongo que es bueno por razones de seguridad.Espero que esto ayude a alguien más que está luchando con simples solicitudes de ajax de su aplicación PhoneGap.

+0

Acepte su respuesta en lugar de escribir "resuelto" en la pregunta; si tiene que esperar una cierta cantidad de tiempo antes de poder hacer eso, espere esa cierta cantidad de tiempo: hay una razón por la cual el sistema lo hace. –

+0

Además, podría agregar, si no quiere preocuparse por las restricciones en cuanto a 'ExternalHosts' en su aplicación PhoneGap, simplemente agregue' *. * 'Y se le permitirá enviar solicitudes y recibir respuestas hacia y desde cualquier servidor. – user1029978

+0

Lo siento Tomalak, esta es la primera vez que publico una pregunta aquí. Todavía no estoy acostumbrado a las reglas y prácticas habituales. Acabo de ver que otros tienen el prefijo "SOLUCIONADO:" en su pregunta. – user1029978

0

Se parece que está ejecutando su servidor localmente (basado en la dirección IP 192.168.xx), lo que significa que solo los dispositivos conectados a su red pueden acceder a él. Puede conectar el teléfono a la misma red wifi que su computadora como solución temporal. Pero vas a necesitar alojar esto en un servidor real para que sea accesible a través de Internet.

También puede reenviar el puerto 80 de su enrutador a esta dirección IP y luego usar su dirección IP real (consulte whatsmyip.org) en su url de solicitud. Pero esa no es una solución realmente estable.

+0

¡Gracias a Jason por tu respuesta! Sin embargo, lo intenté subiendo el script php a otro servidor LAMP externo alojado en un hotel web y cambié el URL en mi solicitud ajax, pero esto tampoco funcionará. En mi navegador, esa solución aún funciona. La solución que sigo encontrando cuando Google esto es que no debería ser más difícil que escribir cualquier URL en cualquier script del lado del servidor y debería funcionar: – user1029978

+0

Por ejemplo: 'ajax.open (" GET "," http://search.twitter.com/search.json?q=bacon ", cierto);' Pero no puedo hacer que esto funcione. Por cierto, estoy usando el simulador iOS, no ejecutando la aplicación en un teléfono físico. Esto no debería ser un problema, sin embargo, puedo acceder a todos los servidores desde el navegador Safari móvil en el simulador. – user1029978

+0

El ejemplo del tocino ajax de http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample funciona bien en mis dispositivos Android –

Cuestiones relacionadas