Frameworks Servicios Web.pdf

12
UNIVERSIDAD DE PAMPLONA Framework para la creación de Servicios Web Electiva de Ingeniería II Jorge Andrés Moreno Jaimes 24/10/2012

Transcript of Frameworks Servicios Web.pdf

Page 1: Frameworks Servicios Web.pdf

UNIVERSIDAD DE PAMPLONA

Framework para la creación de Servicios

Web Electiva de Ingeniería II

Jorge Andrés Moreno Jaimes

24/10/2012

Page 2: Frameworks Servicios Web.pdf

Contenido NuSOAP en CodeIgniter ...................................................................................................................... 3

1. ¿Qué es NuSOAP? ....................................................................................................................... 3

2. Integrando NuSOAP en CodeIgniter ............................................................................................ 3

3.Creando un servidor NuSOAP en CodeIgniter .............................................................................. 5

Creación Servicio Web con Php utilizando JSON ................................................................................ 8

Trabajos citados ................................................................................................................................ 12

Page 3: Frameworks Servicios Web.pdf

NuSOAP en CodeIgniter

1. ¿Qué es NuSOAP?

Pero antes echemos un vistazo a ojo de pájaro qué es y para qué sirve la librería NuSOAP. Esta

utilísima librería 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 harán mucho más fácil 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 más herramientas de este tipo, podría decirse que esta es de las mejores y por tanto, de

las más 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 librería, 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 integración.

La forma más cómoda de integrar esta librería en CodeIgniter es creando nuestra propia “pseudo”

librería de CodeIgniter la cual a su vez llama y permite el uso de la verdadera librería NuSOAP que

nos hemos bajado previamente. Digo “pseudo” porque realmente lo único que haremos será una

interfaz de comunicación entre los controladores de nuestra aplicación y la librería NuSOAP en sí

misma. Pasamos a desarrollar nuestra propia librería CodeIgniter, para ello creamos un nuevo

archivo llamado nuSoap_lib.php (o como ustedes quieran llamarlo, el nombre sólo depende de su

imaginación) dentro del directorio /system/application/libraries, al mismo nivel que el directorio

que contiene a la librería NuSOAP.

Dentro de nuSoap_lib.php introducimos el siguiente código:

<?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

}

Page 4: Frameworks Servicios Web.pdf

}

?>

Con esto ya tenemos creada nuestra “pseudo” librería de NuSOAP, a partir de ahora ya podemos

utilizarla desde nuestros controladores. Para ello hemos de introducir el siguiente código en

nuestro controlador para llamar a la librería 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 aplicación implementada con

CodeIgniter. Como ven, es bastante sencillo y muy cómodo. Una razón más para seguir utilizando

este sencillo y potentísimo framework que es CodeIgniter.

Page 5: Frameworks Servicios Web.pdf

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 vía web a su cliente remoto,

por lo que en ningún momento será necesario mostrar dichos datos en pantalla en el servidor.

Bien, después 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 código:

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",

Page 6: Frameworks Servicios Web.pdf

"rpc",

"encoded",

"Obtiene la información 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 más 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)

Page 7: Frameworks Servicios Web.pdf

compositor. Este campo indica cómo 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, sólo 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 serán esos

campos.

Una vez hemos definido el tipo que vamos a utilizar, en la función “$this->nusoap_server-

>register” creamos el método que podrá ser llamado desde cualquier cliente externo. En él

establecemos:

1. El nombre del método

2. Los parámetros de entrada que necesita nuestro método

3. El tipo de los parámetros de salida que devolverá nuestro método

4. Espacios de nombres del método

5. Acción a realizar dentro del espacio de nombre (el mismo nombre del método)

6. Estilo

7. Uso

8. Información sobre el método

Con esto ya tenemos casi listo nuestro servidor de servicios web NuSOAP. Sólo nos falta un detalle

de configuración. En el archivo “system/application/config/routes.php” hemos de añadir 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.

(Casás)

Page 8: Frameworks Servicios Web.pdf

Creación Servicio Web con Php utilizando JSON

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.

Page 9: Frameworks Servicios Web.pdf

<?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.

<?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);

Page 10: Frameworks Servicios Web.pdf

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.

<?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;

}

}

Page 11: Frameworks Servicios Web.pdf

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. (www.nosinmiubuntu.com)

Page 12: Frameworks Servicios Web.pdf

Trabajos citados Casás, A. V. (s.f.). PHP'S Blog. Obtenido de http://phpsblog.wordpress.com/2009/12/04/creando-

un-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