Cómo crear servicios web PHP

Buenas, la semana pasada vimos como instalar un servidor LAMP en nuestro Ubuntu y las herramientas necesarias para desarrollar con PHP y MySQL. Esta semana nos ponemos manos a la obra y veremos como desarrollar un pequeño servicio web para poder utilizarlo más tarde desde una aplicación Android y nutrir nuestra aplicación con datos.



Los formatos más utilizados para compartir información mediante estos servicios web son XML (y otros derivados) y JSON. XML es un lenguaje de marcas muy similar al HTML, lo podéis ver normalmente en las fuentes RSS utilizadas para difundir listas de noticias. JSON es un formato ligero de intercambio de datos. Este último da mejores resultados en cuanto a rapidez y procesamiento, por lo tanto utilizaremos este, pero si queréis utilizar XML solamente deberéis cambiar el formato de salida y listo.


Nuestro servicio va a devolvernos una lista de libros, para ellos primero crearemos una base de datos. Abrimos phpMyAdmin para ello en un navegador escribimos http://localhost/phpmyadmin. Vamos a "Base de datos" y creamos una nueva base de datos, le llamaremos android, aparecerá en la lista de la parte izquierda. Pinchamos sobre ella y creamos una nueva tabla llamada libros con 3 columnas: id_libro, libro y isbn. Actualización: ponemos los nombres de las columnas en minúscula para no tener problemas a la hora de leerlo con el script PHP.




Para cada uno de los campos deberéis indicar de que tipo es, id_libro es un INT además como va a ser un identificador será PRIMARY y para que cada vez que insertemos un registro no nos tengamos que preocupar de calcular este dato marcamos la casilla AUTO INCREMENT.
Los campos libro y isbn son de tipo texto, tenemos VARCHAR el cual debemos indicar la longitud máxima, en nuestro caso pondremos 1.000 y 50 respectivamente. Existe otro tipo de dato para texto, TEXT, ideal cuando almacenamos grandes cantidades de texto, como por ejemplo el texto HTML de este artículo.
Una vez creada la tabla la seleccionáis e insertáis 4 ó 5 registros para que luego al crear el servicio podamos comprobar como funciona.






El siguiente paso es crear nuestro servicio para ello abrimos nuestro IDE BlueFish y dentro de la ruta /var/www/ creamos una carpeta android para nuestro servicio. El servicio constará de varios archivos los cuales os iré detallando que es lo que hace cada uno. Para crear cada uno de ellos haremos botón derecho del ratón sobre nuestra carpeta android, seleccionamos archivo nuevo y le damos el nombre correspondiente.


Empezamos con globals.php, el cual va a tener parámetros de configuración, en principio para poder acceder a la base de datos. Como podéis ver he creado una clase config y las propiedades son static, es decir, no necesito crear un objeto config para poder acceder a estas. Como veis PHP soporta programación orientada a objetos, aunque si queréis podéis utilizar programación estructurada.


<?php
class config{
 public static function getBBDDServer() {
  return 'localhost';
 }
 
 public static function getBBDDName(){
  return  'android'; 
 }
 
 public static function getBBDDUser(){
  return 'root'; 
 } 
 
 public static function getBBDDPwd(){
  return 'xxxxxx'; 
 }
}
?>


El siguiente archivo será dbmanager.php, este archivo nos ayudará a gestionar la base de datos y las consultas que hagamos a ella. Lo voy a hacer lo más básico posible para no complicar mucho el ejemplo. Vuelvo a crear una clase dbmanager con el método executeQuery, al que le pasamos una consulta, esta se ejecuta y nos devuelve el resultado.

include_onde
Destacar la instrucción include_once para referenciar nuestro archivo de configuración. Existe también la instrucción include, la diferencia entre ellas es que la primera solo incluye una vez el mismo archivo, lo cual puede dar problemas si se incluye más de una vez.

Para poder utilizar las propiedades de esta clase lo hacemos con el nombre de la clase seguido de :: y el nombre de la propiedad o método.


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

class dbmanager{
 
 public function executeQuery($sql){
  $con = mysql_connect(config::getBBDDServer(), config::getBBDDUser(), config::getBBDDPwd());
  if (!$con)
    {
     die('Could not connect: ' . mysql_error());
    }
  
  mysql_select_db(config::getBBDDName(), $con);
  
  $result = mysql_query($sql);
  
  mysql_close($con);
  return $result;
 }
}
?>


El siguiente archivo es libros.php, otra vez hago los include de los archivos necesarios y creo una clase libros con dos métodos. El primero de ellos getLibros, crea un objeto dbmanager y ejecuta la consulta que hemos construido en el mismo método. Como veis es private por que lo vamos a utilizar únicamente dentro de la clase.
El segundo método getJSONLibros es publico y se encarga de obtener los datos con el método anterior y almacenar el resultado en la variable $result, luego la recorre y construye la estructura JSON con cada uno de sus items, y por ultimo devuelve la variable $json.



Variables PHP
Como veis las variables en PHP se declaran con un $ siempre delante y para utilizar metodos de un objeto que hemos instanciado sería clase->metodo. Si el método está en la misma clase seria $this->metodo.



<?php
include_once('globals.php');
include_once('dbmanager.php');

class libros{

      private function getLibros(){
 $sql = "SELECT l.* ";
 $sql .= " FROM libros AS l ";
 $db = new dbmanager();
 return $db->executeQuery($sql);
     }

     public function getJSONLibros(){
        $json = "";
 $i = 0; 
 $result = $this->getLibros();
 $json .= " { \"libros\" : [ ";

 while($row = mysql_fetch_array($result)){
    if($i > 0)
     $json .= ",";
 
    $json .= " { \"id\" : ".$row['id_libro'].", \"libro\": \"".$row['libro']."\", \"isbn\": \"".$row['isbn']."\" ";    
    $json .= "} ";   
    $i++;
   }  
  
 $json .= " ] ";
   $json .= " } ";  
   return $json; 
    }
}


El último archivo es al que llamaremos para obtener el resultado de nuestro servicio, lo llamaremos service.libros.php. Este archivo es muy simple, únicamente se hace el include necesario, instancia la clase libros e imprimimos el resultado del método getJSONLibros.


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

$libros = new libros();
echo $libros->getJSONLibros();
?>


Por último probamos en el navegador este servicio con la url http://localhost/android/service.libros.php. Debería aparecer el JSON correspondiente, si queréis comprobar que está todo correcto podéis hacerlo en alguna de las webs que lo hacen online, http://jsonlint.com/ por ejemplo.

Ahora ya tenemos listo nuestro servicio listo para poder leerlo con cualquier cliente, en nuestro caso haremos un cliente en Android la semana que viene que lea este JSON y nos lo muestre.

Comments are closed.