UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS FACULTAD DE INGENIERIA DOCTORADO EN INGENIERÍA COMPETENCIAS EN CIENCIA DE LA INFORMACIÓN Y EL CONOCIMIENTO Carlos Enrique Montenegro Marín Ingeniero de Sistemas de la Universidad Distrital Magister en ciencias de la Información y las comunicaciones de la Universidad Distrital DEA en ingeniería de Software de la Pontifica Universidad de Salamanca PhD en Sistemas y Servicios informáticos para internet de la Universidad de Oviedo Correo Electronico: cemontenegrom@udistrital.edu.co ingcarlosmontenegro@gmail.com Linkedin: http://es.linkedin.com/pub/carlos-enriquemontenegro-marin/26/584/82a Facebook: http://www.facebook.com/ingcarlosmontenegro Twitter @ingcemm Tutorial Servicios Web Cómo crear servicios web PHP Lo primero a l considerar es que debe tener instados los servicios de Apache, MySQL y PHP, para ello puedo utilizar programas como XAMP. 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, se puede 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, como ya hemos visto servicios web con XML ahora utilizaremos JSON. 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 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 HTML. Una vez creada la tabla la, seleccionarla e insertar 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 /Applications/XAMPP/htdocs creamos una carpeta android para nuestro servicio. El servicio constará de varios archivos los cuales se irán 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 se puede 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 se ve PHP soporta programación orientada a objetos, aunque si se quiere se puede 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 'root'; } } ?> 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. 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 se ve 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. Como se ve las variables en PHP se declaran con un $ siempre delante y para utilizar métodos 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 http://localhost/android/service.libros.php Debería aparecer el JSON correspondiente. este servicio con la url Leyendo servicios web desde Java Ahora en este el ejercicio lo que vamos a hacer es conectarnos a nuestro servidor y leeremos el contenido JSON. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; public class JsonParsing { private static String getContenidoHTML() throws IOException { URL url = new URL("http://localhost/android/service.libros.php"); URLConnection uc = url.openConnection(); uc.connect(); //Creamos el objeto con el que vamos a leer BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); String inputLine; String contenido = ""; while ((inputLine = in.readLine()) != null) { contenido += inputLine + "\n"; } in.close(); return contenido; } public static void main(String[] args) throws Exception { String CadenaJson = getContenidoHTML().toString(); System.out.println(CadenaJson); } } Con esto lo único que faltaría es utilizar un parseador a objetos JSON.