Peticiones AJAX con Phonegap y jQuery

por

Como todos ya sabemos qué es Phonegap y cómo funciona gracias a ¿Qué es Phonegap?, ahora vamos a pasar a aprender como realizar una petición AJAX al servidor y que éste nos devuelva una respuesta. Para ilustrar mejor esta lección vamos a hacerlo sobre la base de un Login.

La tarea consistirá en crear una página de Login en el que deberemos introducir Usuario y Contraseña y al enviar los datos el servidor retornará ciertos datos necesarios para identificar el usuario.

Lo primero de todo vamos a crear una págna HTML de Login.html cuya ruta será assets/login.html

			
		
		
		


		

Login

Como podemos observar en el código anterior, hemos declarado un evento "click" que se invoca cuando intentamos enviar el formulario. Este evento recoje los datos introducidos y se los pasa a la función login() que es la encargada de procesarlos. Además, si os fijáis encriptamos el password en md5 para evitar enviarlo en texto plano y que cualquier persona lo pueda capturar.

El siguiente paso será declarar la función login() y que esta procese los datos recibidos. Para ello creamos un archivo llamada funciones.js


	var public_key="123456789";
	
	function login(user, pass){
	
		$.getJSON('http://www.midominio.com/app/services/login.php?callback=?',{user:user, pass:pass, key:public_key},function(data){
			
			if(data.error > 0){
			
				switch (data.error){
				
					case '1':
						alert('Debes rellenar todos los campos');
						break;
					
					case '2': 
						alert('Usuario o password incorrecto');
						break;
					default: 
						alert('Error desconocido');
						break;
				
				}
			}
			
			else{
			
				/** GUARDAMOS DATOS EN localStorage **/		
				window.localStorage.setItem("id_user", data.id_user);
				window.localStorage.setItem("username", data.username);
				window.localStorage.setItem("private_key", data.private_key);	
			}
			
			
		});
	}
	

Para comprender el funcionamiento de esta función debemos tener en cuenta los siguientes puntos:

  • El formato del objeto devuelto por el servidor será JSONP por lo que la petición deberá ser realida con $.getJSON()
  • Para evitar que cualquier persona externa pueda hacer peticiones al servidor sin nuestro consentimiento hemos agregado una public key que sirve como primera defensa. Después veremos como introducir más defensas contra accesos no permitidos.
  • Una vez sepamos que tanto el usuario como su contraseña son correctos, guardaremos ciertos datos necesarios en el almacenamiento local del teléfono móvil. Estos actuarán como lo harían en $_SESSION.

Por último, debemos crear el servicio en el servidor que reciba los datos y devuelva el objeto JSONP. Lo hemos llamado login.php y como se puede ver en getJSON() esta alojado en www.midominio.com/app/services/. Vosotros debéis alojarlo en vuestro servidor.

   $id_user, "username" => $username, "private_key" => $private_key ,"error" => "0");
				$json = json_encode($data);				
				
			}
			else{

				$data = array("error" => "2");
				$json = json_encode($data);	
			}
		}			
		else{

				$data = array("error" => "1");
				$json = json_encode($data);	
		}
		
		echo $_GET['callback'] . '(' . $json . ')';		

?>

Recibimos el usuario, contraseña y public key a través de $_GET[]. Realizamos las comprobaciones pertinentes para saber si existe el usuario y su contraseña es correcta y si así es, actualizamos su fecha de acceso y creamos una private_key para él.

La private_key se utilizará para prevenir accesos prohibidos a secciones privadas que sólo deberían tener acceso el propio usuario. Esta private_key se genera al loguearse un usuario y se genera a partir de la public_key, la fecha de acceso y una cadena de texto cualquiera y se encripta con md5 para que no pueda ser leída por nadie. La private key de cada usuario se regenerará cada vez que el usuario inicie sesión.

COMENTARIOS

09-12-2014 21:23:46
Parece ser que simplemente te falta incluir el archivo cordova_plugins.json . Revisa que tienes ese archivo en la ruta que te indica.
09-12-2014 01:25:25
Gracias por tu ejemplo! Lo estoy usando tal cual, pero no obtengo resltados; me sale siempre el mensaje "Debes llenar todos los campos"; e inspeccionando la consola, veo el siguiente error, que no sé si realmente es común: GET http://localhost/mi_app/assets/www/cordova_plugins.json 404 (Not Found) Espero puedas ayudarme! Muchas gracias! y Excelente post!!!!
05-05-2014 18:38:28
Para hacer el getJSON necesitas tener la librería de jQuery en tu proyecto si.
05-05-2014 17:37:26
muy interesante el post, solo una pregunta necesito tener plugin del json en mi proyecto?

DEJA TU COMENTARIO