2011-06-29 12 views
9

Tengo una aplicación web móvil construido con las siguientes versiones: -jQuery Mobile + Phonegap: Ajax llamadas que no trabaja en Android Emulador

  1. jQuery Mobile: Alpha 4 v1.0a4.1
  2. JQuery: v1 .6.1
  3. PhoneGap: v0.9.5

Usando PhoneGap, esta aplicación está integrada en una aplicación nativa de Android y desplegado.

En mi aplicación, hago varias llamadas AJAX usando $ .ajax a sitios web externos. Para esto utilizo dataType: 'jsonp' para hacer las llamadas de dominio cruzado.

Cuando estaba probando mi aplicación en Chrome v12.0.742.100, todo funcionaba bien y no tuve problemas para recuperar los datos de los sitios externos. Sin embargo, tan pronto como empaqué esto en un archivo .apk e intento ejecutar esto en el emulador, descubro que ninguna de las llamadas ajax funciona.

He puesto alertas antes y después de la llamada ajax y verificado que se invocaron ambas alertas, pero la llamada ajax es tan buena como ignorada. Tengo el inicio de sesión tanto en la devolución de llamada exitosa como en la devolución de llamada por error y no se está llegando a ninguno de los dos. También he verificado colocando un punto de interrupción en el sitio web del servidor externo (para mis pruebas, solo tengo un sitio web separado en mi máquina local) y definitivamente no se está llamando a la página del servidor.

En Logcat, el error que puedo ver es la siguiente: D/SntpClient (59): momento solicitar fallado: java.net.SocketException: familia de direcciones no es compatible con el protocolo

Soy bastante nuevo a phonegap, así como Jquery Mobile, pero hasta donde entiendo, el archivo de la aplicación de mi teléfono se hace referencia por file: /// protocolo mientras que mi URL AJAX es http://127.0.0.1:someport/someapp/somepage y el error parece indicar que estos dos no se mezclan !! Si este es realmente el caso, ¿cómo hago para hacer llamadas ajax desde una aplicación implementada en un teléfono fijo?

¡Por favor, siéntase libre de señalar cualquier otra cosa que pueda ser útil! Estoy bastante perplejo en este punto.

Editar: He comprobado el archivo AndroidManifest.xml y todos los permisos según este phonegap wiki link se establecen en este archivo.

Edición 2: Adición en mi código del lado del cliente que intitiates la llamada ajax

var serverUrl = "http://localhost:2424/MyServer/RetrieveMasterData.aspx"; 
      $.ajax({ 
       url: serverUrl, 
       type: 'POST', 
       dataType: 'jsonp', 
       data: { MasterDataID: 1 }, 
       success: function(response) { 
         ...... business logic here 
       }, 
       error: function(xhr, ajaxOptions, thrownError) { 
         ...... error handling something here 
       } 
      }); 
+0

Hola, ¿ha agregado el permiso para conectarse a Internet? – Francisc

+0

No tengo idea de por qué funciona en tu Chrome, pero no en tu Android. Pero una cosa que sé con certeza es que la misma política de origen no se aplica al protocolo file: ///. – root

+0

Puedes publicar un fragmento de código que muestre el problema. –

Respuesta

2

Debido a que la solicitud no está en el mismo dominio, y he resuelto el problema mediante la adición de jqm config que:

$(document).bind("mobileinit", function() { 
    // Make your jQuery Mobile framework configuration changes here! 

    $.mobile.allowCrossDomainPages = true; 
}); 

y esto es un enlace: http://jquerymobile.com/demos/1.0/docs/pages/phonegap.html

0

Otro problema que ocurre en Android 4.0+ (pero no en versiones anteriores como 2.3) ...es para llamadas ajax que requieren autenticación básica. Debe configurar manualmente el encabezado Authorization en beforeSend. No puede usar el nuevo nombre de usuario: contraseña: opciones agregadas en jQuery 1.7.

El siguiente ejemplo ilustra lo que tiene que hacer. Nota: Esto requiere el plugin jquery base64.

$.ajax({ 
      url: "https://yoururl, 
      type: method, 
      dataType: 'json', 
      // username: username, // Doesn't work on ANDROID 
      // password: password, // Doesn't work on ANDROID 
      beforeSend: function (xhr) 
      { 
       xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode(username + ":" + password)); 
      }, 
      data: options.data, 
      success: function(response) { 

      }, 
      error: function(jqXHR, textStatus, errorThrown) { 

      } 
     }); 
+0

Supongo que su código es para GET, pero, ¿qué pasa con POST ?, ¿cómo enviar datos? –

Cuestiones relacionadas