Cómo enviar datos a un servidor en Android (II): servicio web

Buenas, la semana pasada vimos la primera parte de como enviar datos a un servidor. Esta semana continuamos y vamos a ver un poco de PHP. Vamos a aprovechar el código que utilizamos para crear servicios web en PHP para centrarnos en lo importante.

Si le echáis un vistazo teníamos los archivos:
  • globals.php, tiene la configuración para acceder a la base de datos, aquí cada uno tiene que aplicar la configuración de su equipo.
  • dbmanager.php, hace la conexión a la base de datos.
  • libros.php, es la clase que leía libros de una base de datos y nos los devolvía en formato json para leer.
  • service.libros.php, es la cara visible por así decirlo para nuestra app Android. Para este ejemplo crearemos otro archivo que recibirá parámetros y insertará libros en la base de datos.

En el archivo libros.php vamos a crear un nuevo método llamado insertLibro. Como veis se crea una instrucción SQL Insert. Para evitar problemas de SQL Inyection utilizaremos la instrucción mysql_real_escape_string. Una vez creada la instrucción instanciamos la clase dbmanager, ejecutamos la instrucción y si existe algo en $result hemos tenido éxito. Obtenemos el id del libro insertado con mysql_insert_id() y leemos todos los datos del libro y los devolvemos.

private function insertLibro($libro, $isbn){
  $sql = sprintf("INSERT INTO libros (libro, isbn) VALUES ('%s', '%s') ",mysql_real_escape_string($libro), mysql_real_escape_string($isbn));

 $db = new dbmanager();
 $result = $db->executeQuery($sql);
 if($result){
   $idlibro = mysql_insert_id();
   $sql = "SELECT * FROM libros WHERE id_libro = " . $idlibro;
   $result = $db->executeQuery($sql);
   return mysql_fetch_array($result);
 } else {
   return false;
 }
}

El siguiente paso es crear un método que llame a la inserción y prepare un json con el resultado de la acción. Se podría poner todo en el método anterior o separar más los métodos de inserción y lectura. Yo simplemente separare la lectura de json del acceso a base de datos. El método a crear va a ir también en libros.php y se llamará getJSONInsertLibros.

public function getJSONInsertLibros($libro, $isbn){
 $response = array("tag" => "insert", "success" => 0, "error" => 0);
 $libro = $this->insertLibro($libro, $isbn);
 if($libro != false){
   $response["success"] = 1;

   $response["libro"]["id"] = $libro['id_libro'];
   $response["libro"]["titulo"] = $libro['libro'];
   $response["libro"]["isbn"] = $libro['isbn'];

   return json_encode($response);
 } else {
   $response["error"] = 1;
   $response["error_msg"] = "No se insertó el libro";
   return json_encode($response);
 }
}

Ahora lo que estamos haciendo es, en primer lugar crear un array que nos ayudará a crear el json. Añadimos primero datos como el tag, que nos ayudará a saber que acción estamos realizando. Success, que nos dirá si tuvimos éxito o no, por defecto no tenemos éxito y error, de momento no hay ninguno.

llamamos al método insertLibro y guardamos el resultado en $libro. Ojo, debemos comprobar que el resultado sea diferente de false no igual a true, esto es por que en caso de éxito devolvemos un array con los datos del libro y en caso contrario un false.

Si falla algo simplemente seteamos el error a 1, añadimos un mensaje de error y devolvemos el array pasandole la función json_encode. Esta va a parsear el array a una cadena de texto json.

En caso de que inserte y todo vaya bien, seteamos success a 1, luego añadimos un nivel más en el array para representar un objeto libro. Dentro de libro iremos seteando cada uno de los parámetros que queremos enviar, el id, el título (no le llamo libro para que lo diferenciéis del objeto libro) y isbn. Como antes aplicamos la función json_encode y lo devolvemos.

El último paso es preparar un pequeño archivo que llamaremos service.libro.add.php. Este va a recibir los parámetros que envie el usuario por POST y llamará al método anterior.

<?php
include_once('libros.php');

$libros = new libros();
if(isset($_POST['libro'])  && isset($_POST['isbn']) ){
   echo $libros->getJSONInsertLibros($_POST['libro'], $_POST['isbn']);
} else {
   echo $libros->getJSONError('insert','Error en el envío de datos');
}
?>

Llegado a este punto podríamos recoger los parámetros por POST y llamar al método getJSONLibros, pero vamos a darle un punto más de personalización. Puede ocurrir que no se envíen los datos por POST o que cualquier otra validación que se os ocurra no pase vuestro filtro, así que vamos a crear un método genérico que nos de un json con un error personalizado, de esta forma podemos controlar un poco mejor los mensajes que damos a nuestra aplicación Android y por tanto al usuario. Crearemos getJSONError en el archivo libros.php

public function getJSONInsertLibros($tag, $errormsg){
   $response = array("tag" => $tag, "success" => 0, "error" => 1, "error_msg" => $errormsg); 
   return json_encode($response); 
}

Con esto ya tenemos creado nuestro servicio web en PHP para insertar datos. La semana que viene veremos como enviar estos datos desde Android y darle un mensaje con el resultado al usuario en función de lo que ha ocurrido en el servidor.

Comments are closed.