2012-04-16 22 views
19

Estoy creando una aplicación PhoneGap para Android. Para obtener datos del servidor (remoto) realizo una llamada REST usando la función $ .ajax() de jQuery. Hay algunas cosas que usted debe saber:Las solicitudes de dominio cruzado con PhoneGap y jQuery no funcionan

  • tipo de llamada debe ser post
  • El servidor espera de datos JSON (al menos de nombre de usuario y contraseña)
  • el servidor devuelve datos JSON

El código:

function makeCall(){ 
    var url = "http://remote/server/rest/call"; 

    var jsonData ='{"username":"'+$('#username').val()+'","password":"'+$('#password').val()+'"}'; 

    $.ajax({ 
      headers: {"Content-Type":"application/json; charset=UTF-8"}, 
      type: "POST", 
      url: url, 
      data: jsonData, 
      dataType: "json", 
      success: succesFunction, 
      error: errorFunction 
    }); 
} 

embargo, esto no funciona. Cuando uso Firebug para ver la respuesta de los servidores, no hay nada. Con TcpTrace puedo ver los encabezados de la solicitud. En lugar de un método POST esperado, hay un método OPTIONS, con algunos encabezados extraños agregados.

OPTIONS /remote/server/rest/call HTTP/1.1 
Host: localhost:8081 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: nl,en-us;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Origin: null 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Pragma: no-cache 
Cache-Control: no-cache 

Sé que tiene algo que ver con hacer solicitudes entre dominios, pero no sé cómo resolver el problema. He intentado algunas cosas para solucionarlo, pero sin resultado:

El problema también tiene algo que ver con la misma política de origen, pero esto no se aplica al archivo: // protocolo que PhoneGap está usando para cargar un archivo html local.

En mi archivo AndroidManifest.xml, la opción

<uses-permission android:name="android.permission.INTERNET" /> 

se establece.

Estoy tratando de solucionar esto durante 2 días, pero no se han obtenido resultados hasta ahora. ¿Es esto posible? ¿Tienes algún consejo para mí para seguir adelante?

¡Gracias de antemano!

Respuesta

8

He resuelto el problema yo solo. El problema se encuentra en la url, donde tengo que agregar un dominio.He cambiado

var url = "http://remote/server/rest/call";

a

var url = "http://remote.mydomain.com/server/rest/call";

y funciona!

Supuse que la primera url debería funcionar porque funciona en una aplicación de iPhone con exactamente la misma url y configuraciones. También tiene algo que ver con un doble firewall (firewall de Windows y ESET) donde apago el firewall de Windows.

De todos modos, gracias por sus respuestas!

+0

su problema puede ser corregido, pero esta no es la respuesta que resuelve el problema de solicitud entre dominios – Asqan

0

Pruebe la configuración dataType:jsonp y establezca crossDomain:true Para solicitudes de dominio cruzado ajax, puede usar jsonp. http://api.jquery.com/jQuery.ajax/

O puede agregar callback =? a tu url

+0

Ya probé con lo que sugiere, pero no funciona. Todavía el mismo problema. Gracias por tu respuesta. – weerd2

+2

JSONP no sustituye un dominio cruzado POST – contactmatt

10

necesita incluir en la lista blanca sus dominios externos. solo vaya a su archivo de phonegap/cordova plist en xcode y agregue una nueva entrada, tenga su valor * y puede acceder a cualquier sitio web que exista.

también saben que esto NO FUNCIONARÁ EN UN NAVEGADOR. Los navegadores tienen problemas de dominio cruzado, no de teléfono o dispositivos móviles.

+1

En realidad ... podría funcionar en Safari si carga a través de 'file: //', pero Chrome y FF son un no ir ... – Devgeeks

+7

puede hacerlo funcionar en Chrome al deshabilitar la seguridad web. en Windows Ejecutar> 'chrome --disable-web-security' En Mac OS'> sudo/Aplicaciones/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --disable-web-security --enable-geolocation ' – Peter

+0

Gracias por sus reacciones chicos, pero todavía no funciona. Aún se ejecuta la función de error cuando se completa la solicitud. Creo que tiene algo que ver con la configuración del servidor. ¡Lo echaré un vistazo ahora y lo mantendré actualizado! – weerd2

1

Configuración de JQuery: $. Support.cors = true;

3

Sumado al config.xml me salvó

<gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" version="1.1.1" /> 
<access origin="*" /> 
<allow-navigation href="*" /> 
<allow-intent href="*" /> 

que estaba desconcertado por qué ningún recurso externo no se ha cargado, incluso Google Maps y mi herramienta de depuración remota. ¡Esto me salvó!

+0

¡Fue realmente útil! – Schiavini

Cuestiones relacionadas