entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Problema con CORS

Buenas, Tengo una cuestion al desarrollar mi App con Apache Cordova la problematica es que ya genere el servicio y ya pude consumirlo con Ajax con una sugerencia de un miembro de esta misma comunidad (Gracias)
actualmente me arroja este error:
"Solicitud desde origen distinto bloqueada: la política de mismo origen impide leer el recurso remoto en http://192.168.0.12:8081/JSON/data.php. Esto se puede arreglar moviendo el recurso al mismo dominio o activando CORS."

Donde mi archivo html con JS es este:

<script type="text/javascript">
var cadena;
$.ajax({
method: "GET",
url : "http://192.168.0.12:8081/JSON/data.php",
success : function(h)
{
cadena = JSON.parse(h);
}
});

    var msj = "Cargando Preguntas";
    alert(msj);
    ////INSERT 
    for( var i = 0; i < cadena.registro.length; i++ ) {
     document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">"+
        cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
      ///alert(datos.registro[i].Pregunta);
      for( var j = 0; j < cadena.registro[i].Respuestas.length; j++ )
      {
    document.write(" <div class=\"radio\">  <input type=\"radio\" name=\"optradio\">  "+cadena.registro[i].Respuestas[j]+"</div>");
       /// alert(datos.registro[i].Respuestas[j]);
      }
      document.write("</div></div></div>");
      }
</script>

la duda es: ¿Como habilito el CORS del lado del servidor? recordando que Apache Cordova solo permite archivos html.

1 Respuesta

1voto

Leonardo-Tadei Puntos211470

Hola Adan,

tu problema no parece relativo a Apche Cordova en sí, sino a las restricciones de las llamadas AJAX entre distintos dominios que hacés vía JQuery.

Podrías probar cambiar directivas del servidor Apache, pero esta alternativa no sirve en producción, ya que en general no tenés acceso a ese tipo e cambios.

Si el problema está porque el ambiente de desarrrolo es distinto al de producción, acá cuentan una técnica simpática para probar la aplicación mientras se desarrolla: http://tech.pro/blog/1704/2-ways-to-get-started-with-phonegapapache-cordova

Si para probar la app usás Chrome, podés invocarlo haciendo:
chrome.exe --disable-web-security en windows
o
google-chrome --disable-web-security en GNU/Linux

para que el navegador no valide la petición.

Si sos vos quien programa "data.php", podés cambiarle las cabeceras para que no se validen las peticiones de dominios cruzados:

header("Access-Control-Allow-Origin: *");

Esto sin embargo a veces no funciona porque el * es demasiado permisivo. En ese caso, invocá a esta función al principio de tu script:

function cors() {
    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
        exit(0);
    }
}

Nota importante: dejar cualqueir cosa de esto en un entorno de producción es una muy mala idea.

AdanCervera comentado Dic 29, 2014

Muchas Gracias Leonardo por responder, estaba a punto de marcar como resuelta la pregunta cuando me encontre con tu comentario y efectivamente introduje el siguiente fragmento de codigo en data.php

if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
}

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");

if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
    header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

}

En manera local al probar el puro documento html funciona perfectamente, ahora al momento de montarlo en la aplicacion no me devuelve ningun tipo de valor, mirare la documentacion que me proporciona para darme un clavado y ver si encuentro la solucion. de ante mano muchisimas gracias; esta web es grandiosa me han despejado dudas de forma muy efectiva.

Leonardo-Tadei comentado Dic 29, 2014

Si la llamada no te devuelve ningún valor, fijate primero que el código en data.php no esté dando errores en el servidor (por ejemplo por usar cosas de una versión de PHP ya no soportada) y que la consulta que se hace sí esté devolviendo resultados para los datos que estén ahí.

Si la rsepuesta es vacía, el problema debería estar en el propio data.php y no en otro lugar...

Por nada! Podés ayudar a que crezca y mejora ED recomendándolo a tus conocidos ;-) es algo simple para todos y a Peter le vendrá muy bien la publicidad.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta