Está en la página 1de 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

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

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 script en un servidor Windows

}

este

}

?>

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.

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

parent::Controller();

construct()

{

$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 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)

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)

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.

<?php class config{ public static function getBBDDServer() { return 'localhost'; } public static function
<?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 =
<?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; } } ?>
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
<?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

el include

necesario,

getJSONLibros.

llamaremos service.libros.php. Este

archivo

e

es muy

el

simple,

únicamente se hace

del

método

instancia

la

clase

libros

imprimimos

resultado

<?php include_once('libros.php'); $libros = new libros(); echo $libros->getJSONLibros(); ?>
<?php
include_once('libros.php');
$libros = new libros();
echo $libros->getJSONLibros();
?>

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.

Por último probamos en

el

navegador

este

servicio

con

la

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

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