Iván López Rodríguez alu3194 SOAP::Lite es una colección de módulos que proveen una interfaz sencilla para trabajar con SOAP. Implementa tanto las funciones del servidor como del cliente. Por lo tanto, usándolo, se pueden hacer aplicaciones cliente/servidor completas. El código necesario es mínimo y fácilmente entendible. Es un protocolo que define cómo dos procesos en diferentes máquinas pueden comunicarse por medio de intercambio de datos XML. Es independiente de la plataforma y el lenguaje. Podríamos comunicar un programa hecho en Java corriendo sobre Windows con uno en Perl corriendo sobre Unix. Al permitir el intercambio de mensajes entre procesos distintos SOAP puede ser usado para: › Hacer llamadas a procedimientos remotos Aprovechar la potencia de otro ordenador Acceso a datos remotos (BBDD) › Construir aplicaciones a base de pequeñas piezas (reutilización). › Servicios web (temperatura, cambio de divisas, e-Administración…) Los archivos fuentes que creemos deben de ubicarse en la carpeta destinada a almacenar los ficheros CGI en un servidor web. Los archivos cliente pueden ser ejecutados en cualquier directorio, en cualquier máquina. Servidor: #!C:\perl\bin\perl.exe use SOAP::Transport::HTTP; SOAP::Transport::HTTP::CGI -> dispatch_to('Servidor') -> handle; package Servidor; sub temperatura { return "La temperatura actual es de 23 grados"; } Cliente: #!C:\perl\bin\perl.exe use SOAP::Lite; print "Se llama al servicio.\n"; my $respuesta = SOAP::Lite -> uri('http://localhost:81/Servidor') -> proxy('http://localhost:81/cgi-bin/servidor.pl') -> temperatura -> result; print "La respuesta del servidor es: $respuesta \n" Ejecución: C:\Documents and Settings\ivan\pp2>perl Cliente1.pl Se llama al servicio. La respuesta del servidor es: La temperatura actual es de 23 grados Servidor: #!C:\perl\bin\perl.exe use SOAP::Transport::HTTP; SOAP::Transport::HTTP::CGI -> dispatch_to('Servidor') -> handle; package Servidor; sub sumador { my $class = shift; my ($a,$b) = @_; return $a+$b; } Cliente: #!C:\perl\bin\perl.exe use SOAP::Lite; print "Se llama al servicio:\n"; my $respuesta = SOAP::Lite -> uri('http://vaio:81/Servidor') -> proxy('http://vaio:81/cgi-bin/servidor.pl') -> sumador(3,4) -> result; print "La suma de 3 y 4 es: $respuesta \n" Ejecución: C:\Documents and Settings\ivan\pp2>perl Cliente2.pl Se llama al servicio. La suma de 3 y 4 es: 7 Gracias a esta característica podemos realizar llamadas remotas como si las hubiésemos definido localmente. #!C:\perl\bin\perl.exe use SOAP::Lite +autodispatch => uri => 'http://vaio:81/Servidor', proxy => 'http://vaio:81/cgi-bin/servidor.pl'; print "La suma de 3 y 4 es ".sumador(4,3)." y su resta ".restador(4,3)." \n" Con esta característica, la reutilización de funciones es absolutamente trivial. C:\Documents and Settings\ivan\pp2>perl Cliente3.pl La suma de 4 y 3 es 7 y su resta 1 Se ha visto como se pueden intercambiar cadenas de caracteres y escalares. También es posible pasar arrays. arrays de arrays, hashes… Éstos tipos de datos pueden ser usados para devolver consultas sobre BBDD. Una de las aplicaciones más importantes de los servicios web. sub maximo { my $class = shift; my $puntero = shift; my @array = @$puntero; my $respuesta = $array[0]; foreach my $valor (@array) { if ($valor > $respuesta) { $respuesta = $valor; } } return $respuesta; } #!C:\perl\bin\perl.exe use SOAP::Lite +autodispatch => uri => 'http://vaio:81/Servidor', proxy => 'http://vaio:81/cgi-bin/servidor.pl'; my @array = (1,2,3,5,4); print "El maximo es: ".maximo(\@array)." \n"; Servidor sub complejo { my $class = shift; my $puntero = shift; my %estructura = %$puntero; $estructura{result} = ${$estructura{a}}[0] + ${$estructura{b}}[2]; return %estructura; } Cliente sub complejo { my $class = shift; my $puntero = shift; my %estructura = %$puntero; $estructura{result} = ${$estructura{a}}[0] + ${$estructura{b}}[2]; return %estructura; } Ejecución Antes $VAR1 = { 'a' => [1, 2, 3 ], 'b' => [4, 5, 6], 'result' => 0 }; y despues $VAR1 = { 'a' => [1, 2, 3 ], 'b' => [4, 5, 6], 'result' => 7 }; Servidor I sub conecta { $db="test"; $host="localhost"; $port="3306"; $userid="root"; $passwd=""; $connectionInfo="DBI:mysql:database=$db;$host:$port "; # Realizamos la conexión a la base de datos $dbh = DBI>connect($connectionInfo,$userid,$passwd); #Sentencia SQL $query = "SELECT Nombre FROM cliente"; Servidor II # Primero hay que "preparar" el query $sth = $dbh->prepare($query); # Ejecutamos el query $sth->execute(); $sth->bind_columns(undef, \$nombre); # Recorremos los resultados obtenidos de la base de datos my @respuesta; while($sth->fetch()) { push (@respuesta,$nombre); } Cliente my $puntero = &conecta; # Nos conectamos con la BD my @array = @$puntero; print "Nombre de los clientes\n"; print "=======================\n\n"; foreach my $valor (@array) { print "$valor\n"; } Ejecución C:\Documents and Settings\ivan\pp2>perl Cliente5.pl Nombre de los clientes ======================= Ana Esther Gustavo Ivan Usando este módulo se pueden desplegar servicios web de forma rápida y eficaz. A la hora de desarrollar la aplicaciones cliente se ha hecho énfasis en ocultar la complejidad y hacerlo transparente al usuario. El módulo se puedes descargar de CPAN aquí.