Crear un webservice REST para Android con PHP – Parte 1

android-logoCuando queremos utilizar una base de datos en un proyecto Android, podemos usar SQLite dentro del proyecto, pero si tenemos una base de datos ya creada en un servidor externo, la cual usamos para la web, tendremos que acceder a ella a traves de un Webservice. En este caso, vamos a crear un webservice REST con PHP y MySQL.

En este primer artículo, vamos a ver la parte del servidor, y en el segundo, veremos la programación Android.

Lo primero que tenemos que tener en cuenta es la estructura de la base de datos. Va a ser una típica tabla usuarios con un Id autoincremental, nombre, email y un numero de partidas. El código de creación es este:


CREATE TABLE `usuarios` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nombre` varchar(45) COLLATE utf8_spanish2_ci NOT NULL,
 `email` varchar(45) COLLATE utf8_spanish2_ci NOT NULL,
 `partidas` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

Ahora para cada función que queremos realizar, vamos a utilizar un archivo php. Así por ejemplo, para listar todos los usuarios, creamos un fichero que se llame users.php. Este va a hacer una consulta a la base de datos y va a devolver los resultados en XML. Las consultas las hago con la librería ezSQL (si quieres ver como funciona, lo puedes ver en este otro artículo). Para crear los XML, tengo unos ficheros con la estructura y unos comodines que voy rellenando con PHP. Veamos el código:


header("Content-type: text/xml");
include_once "classes/ez_sql_core.php";
include_once "classes/ez_sql_mysql.php";
include_once "data/data.php";

$db = new ezSQL_mysql($db_user, $db_pass, $db_database, $db_host);

$rs = $db->get_results("SELECT * FROM usuarios");

if (count($rs)) {

 $xml = file_get_contents('xml/users.xml');

$trozos = explode("##split##", $xml);

$final = $trozos[0];

foreach ($rs as $user) {
 $aux = $trozos[1];

 $aux = str_replace("##id##", $user->id, $aux);
 $aux = str_replace("##nombre##", $user->nombre, $aux);
 $aux = str_replace("##email##", $user->email, $aux);
 $aux = str_replace("##partidas##", $user->partidas, $aux);
 $final .= $aux;

 }

$final .= $trozos[2];
 echo $final;
}else{
 echo file_get_contents('xml/error.xml');
}

Podemos comprobar la respuesta desde nuestro servidor ejecutando el archivo php en el navegador.

Ahora vamos a ver como insertaríamos un usuario nuevo. Creamos un fichero nuevo, llamado insertuser.php. Este php va a recoger unos datos por GET y los va a insertar en la base de datos, luego va a generar un XML con «Usuario insertado» o «Error». Los datos que enviamos por GET obviamente los enviamos desde Android, pero para comprobar que funciona, podemos ejecutar desde el navegador la url donde este el archivo y pasarle los valores: insertuser.php?nombre=pepe&email=pepe@gmail.com&partidas=3. El código quedaría así:


header("Content-type: text/xml");
include_once "classes/ez_sql_core.php";
include_once "classes/ez_sql_mysql.php";
//include_once "classes/userClass.php";
include_once "data/data.php";
$nombre = trim($_GET['nombre']);
$email = trim($_GET['email']);
$partidas = trim($_GET['partidas']);

$db = new ezSQL_mysql($db_user, $db_pass, $db_database, $db_host);

$rs = $db->query("INSERT INTO usuarios (nombre, email, partidas) VALUES ('".$nombre."','".$email."','".$partidas."')");
if ($rs) {

 $xml = file_get_contents('xml/result.xml');
 $xml = str_replace("##result##", "Usuario insertado", $xml);
 echo $xml;
}else{
 echo file_get_contents('xml/error.xml');
}

He subido una copia de esta parte del proyecto en la que hay dos funciones más, actualizar usuario y buscar usuario. También están los xml y las clases ezSQL. La podéis descargar de https://copy.com/2hKXFK6M6UDN.

Antes de terminar, hay que tener en cuenta, que para llevar esto a un proyecto real, habría que hacer un método de seguridad, para que solo nuestra app de Android pudiese acceder a nuestra base de datos. Se crearía una primera llamada al webservice con una clave compartida y se generaría un id de session, el cual habría que comprobar en cada llamada al servidor.

En la siguiente parte del articulo, veremos como hacer las llamadas desde Android y como parsear el XML de respuesta.

¿Te ha gustado este artículo? ¿te ha servido de ayuda? No dudes en comentarlo o compartirlo!

Un saludo, Fran Aramayo

Deja una respuesta