Módulo SOAP::Lite

Anuncio
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í.
Descargar