Sei sulla pagina 1di 12

UNIVERSIDAD DE PAMPLONA

Framework para la creacin de Servicios Web


Electiva de Ingeniera II
Jorge Andrs Moreno Jaimes 24/10/2012

Contenido
NuSOAP en CodeIgniter ...................................................................................................................... 3 1. Qu es NuSOAP? ....................................................................................................................... 3 2. Integrando NuSOAP en CodeIgniter ............................................................................................ 3 3.Creando un servidor NuSOAP en CodeIgniter.............................................................................. 5 Creacin Servicio Web con Php utilizando JSON ................................................................................ 8 Trabajos citados ................................................................................................................................ 12

NuSOAP en CodeIgniter
1. Qu es NuSOAP?
Pero antes echemos un vistazo a ojo de pjaro qu es y para qu sirve la librera NuSOAP. Esta utilsima librera con uso muy extendido en el desarrollo web es un kit de herramientas (ToolKit) para desarrollar Web Services bajo el lenguaje PHP. Est compuesto por una serie de clases que nos harn mucho ms fcil el desarrollo de Web Services. Provee soporte para el desarrollo de clientes (aquellos que consumen los Web Services) y de servidores (aquellos que los proveen). NuSOAP est basado en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1. Aunque no es el nico, dado que existen ms herramientas de este tipo, podra decirse que esta es de las mejores y por tanto, de las ms utilizadas en el desarrollo web.

2. Integrando NuSOAP en CodeIgniter


Una vez que ya sabemos qu es NuSOAP, pasamos a integrarla en nuestro framework de desarrollo. Lo primero ser descargarnos la librera, la descomprimimos y la incluimos en el directorio system/application/libraries de nuestro framework CodeIgniter. Con esto ya tenemos todo listo para poder pasar al siguiente paso: realizar la integracin.

La forma ms cmoda de integrar esta librera en CodeIgniter es creando nuestra propia pseudo librera de CodeIgniter la cual a su vez llama y permite el uso de la verdadera librera NuSOAP que nos hemos bajado previamente. Digo pseudo porque realmente lo nico que haremos ser una interfaz de comunicacin entre los controladores de nuestra aplicacin y la librera NuSOAP en s misma. Pasamos a desarrollar nuestra propia librera CodeIgniter, para ello creamos un nuevo archivo llamado nuSoap_lib.php (o como ustedes quieran llamarlo, el nombre slo depende de su imaginacin) dentro del directorio /system/application/libraries, al mismo nivel que el directorio que contiene a la librera NuSOAP. Dentro de nuSoap_lib.php introducimos el siguiente cdigo:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class nuSoap_lib{ function Nusoap_lib(){ require_once(str_replace("\\","/",APPPATH).'libraries/NuSOAP/lib/nusoap'.EXT); //Por si estamos ejecutando este script en un servidor Windows }

} ?>

Con esto ya tenemos creada nuestra pseudo librera de NuSOAP, a partir de ahora ya podemos utilizarla desde nuestros controladores. Para ello hemos de introducir el siguiente cdigo en nuestro controlador para llamar a la librera nuSoap:
class Client extends Controller { function __construct() { parent::Controller(); $this->load->library("nuSoap_lib"); }

function index() { $this->nusoap_client = new nusoap_client("http://url.servidor.soap");

if($this->nusoap_client->fault) { $text = 'Error: '.$this->nusoap_client->fault; } else { if ($this->nusoap_client->getError()) { $text = 'Error: '.$this->nusoap_client->getError(); } else { $row = $this->nusoap_client->call( 'funcionEnElServidor', array(parametros) ); ... } } }

De esta forma, podremos consumir servicios SOAP desde nuestra aplicacin implementada con CodeIgniter. Como ven, es bastante sencillo y muy cmodo. Una razn ms para seguir utilizando este sencillo y potentsimo framework que es CodeIgniter.

3.Creando un servidor NuSOAP en CodeIgniter


Nuestro servidor NuSOAP en CodeIgniter ser un controlador el cual no necesitar tener su vista correspondiente, dado que nicamente ser accedido para realizar ciertas tareas (incluso interactuar con modelos si fuera necesario) y devolver sus resultados va web a su cliente remoto, por lo que en ningn momento ser necesario mostrar dichos datos en pantalla en el servidor. Bien, despus de aclarar este punto, pasamos a crear nuestro controlador servidor en CodeIgniter, para ello creamos el archivo servidorNuSoap.php dentro del directorio system/application/controller en el cual insertamos el siguiente cdigo:
class ServidorNuSoap extends Controller { function __construct() { parent::Controller();

$this->load->library("nuSoap_lib"); $this->nusoap_server = new soap_server(); $this->nusoap_server->configureWSDL("MiembroWSDL", "urn:MiembroWSDL"); $this->nusoap_server->wsdl->addComplexType( "Miembro", "complexType", "array", "", "SOAP-ENC:Array", array( "id"=>array("name"=>"id", "type"=>"xsd:int"), "nombre"=>array("name"=>"nombre", "type"=>"xsd:string"), "apellido"=>array("name"=>"apellido", "type"=>"xsd:string") ) ); $this->nusoap_server->register( "obtenerMiembro", array( "id" => "xsd:int", ), array("return"=>"tns:Miembro"), "urn:MiembroWSDL", "urn:MiembroWSDL#obtenerMiembro",

"rpc", "encoded", "Obtiene la informacin de un miembro especificado" ); }

function index() { if($this->uri->segment(3) == "wsdl") { $_SERVER['QUERY_STRING'] = "wsdl"; } else { $_SERVER['QUERY_STRING'] = ""; }

$this->nusoap_server->service(file_get_contents("php://input")); } function obtener_miembro() { function obtenerMiembro($idMiembro) { $CI =& get_instance(); $CI->load->model("Miembro");

$row = $CI->Miembro->obtenerMiembro($idMiembro); return $row; } $this->nusoap_server->service(file_get_contents("php://input")); } }

Todo esto est muy bien, pero qu significa todo esto? Bueno, paso a explicar paso a paso qu es y para qu sirve cada cosa. En la funcion $this->nusoap_server->wsdl->addComplexType tenemos varios campos: Nombre. Este ser en nombre que le daremos al tipo. typeClass. Es el tipo propio NuSOAP que compondr nuestro tipo (los ms habituales son complexType o simpleType) phpType. Es el tipo propio de PHP al cual pertenecer la estructura que devolver nuestro servicio (actualmente los soportados son array y struct)

compositor. Este campo indica cmo los subelementos de nuestra estructura funcionan, es decir, son todos elementos opcionales siendo incluidos en cualquier orden (valor all), o son opcionales pero en el orden establecido (valor sequence) o bien, slo uno de ellos est permitido cada vez (valor choice). restrictionBase. Esto le indica al sistema que nuestro tipo complejo se basa en el tipo Array definido en soap-encoding namespace.

Por ltimo, definimos los campos que tendr nuestro campo complejo y de qu tipos sern esos campos. Una vez hemos definido el tipo que vamos a utilizar, en la funcin $this->nusoap_server>register creamos el mtodo que podr ser llamado desde cualquier cliente externo. En l establecemos:

1. 2. 3. 4. 5. 6. 7. 8.

El nombre del mtodo Los parmetros de entrada que necesita nuestro mtodo El tipo de los parmetros de salida que devolver nuestro mtodo Espacios de nombres del mtodo Accin a realizar dentro del espacio de nombre (el mismo nombre del mtodo) Estilo Uso Informacin sobre el mtodo

Con esto ya tenemos casi listo nuestro servidor de servicios web NuSOAP. Slo nos falta un detalle de configuracin. En el archivo system/application/config/routes.php hemos de aadir la siguiente ruta:
$route['ServidorNuSoap/obtieneMiembro/wsdl'] = 'ServidorNuSoap/index/wsdl';

Dado que es imprescindible establecer la ruta correcta a nuestro servicio NuSOAP. Con esto ya tenemos creado y listo para empezar a ofrecer servicios a nuestro flamante servidor NuSOAP integrado en nuestro framework de desarrollo CodeIgniter. (Cass)

Creacin Servicio Web con Php utilizando JSON


Los formatos ms utilizados para compartir informacin mediante estos servicios web son XML (y otros derivados) y JSON. XML es un lenguaje de marcas muy similar al HTML, lo podis 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 queris utilizar XML solamente deberis 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. Actualizacin: ponemos los nombres de las columnas en minscula para no tener problemas a la hora de leerlo con el script PHP Para cada uno de los campos deberis indicar de que tipo es, id_libro es un INT adems 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 mxima, 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 artculo. Una vez creada la tabla la seleccionis e insertis 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 botn derecho del ratn sobre nuestra carpeta android, seleccionamos archivo nuevo y le damos el nombre correspondiente. Empezamos con globals.php, el cual va a tener parmetros de configuracin, en principio para poder acceder a la base de datos. Como podis 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 programacin orientada a objetos, aunque si queris podis utilizar programacin 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 ms bsico posible para no complicar mucho el ejemplo. Vuelvo a crear una clase dbmanager con el mtodo executeQuery, al que le pasamos una consulta, esta se ejecuta y nos devuelve el resultado.

<?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 mtodos. El primero de ellos getLibros, crea un objeto dbmanager y ejecuta la consulta que hemos construido en el mismo mtodo. Como veis es private por que lo vamos a utilizar nicamente dentro de la clase. El segundo mtodo getJSONLibros es publico y se encarga de obtener los datos con el mtodo 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.

<?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 mtodo 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. Debera aparecer el JSON correspondiente, si queris comprobar que est todo correcto podis 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. (www.nosinmiubuntu.com)

Trabajos citados
Cass, A. V. (s.f.). PHP'S Blog. Obtenido de http://phpsblog.wordpress.com/2009/12/04/creandoun-servidor-nusoap-en-codeigniter/ www.nosinmiubuntu.com. (s.f.). No sin mi Ubuntu. Obtenido de http://www.nosinmiubuntu.com/2012/01/como-crear-servicios-web-php.html

Potrebbero piacerti anche