Servicios Web con Perl

De Grupo GNU/Linux de la Universidad del Cauca
Saltar a: navegación, buscar

Noviembre 8 de 2.004.

Por Alejandro Ríos Peña.

El lenguaje Perl cuenta principalmente con dos módulos que pueden ser usados para crear servicios web de manera fácil y rápida, desde cero o reutilizando aplicaciones de Perl ya existentes. Éstos módulos son SOAP::Lite y WSDL::Generator. A continuación se explicarán cada uno de ellos y se mostrará un ejemplo de su uso.

Contenido

SOAP::Lite

SOAP::Lite es un conjunto de módulos de Perl que proveen una interfaz simple y liviana para el protocolo SOAP, tanto en el lado cliente como en el del servidor. SOAP::Lite es actualmente el kit de desarrollo de web services para Perl más difundido y utilizado. Su página en SourceForge ha registrado más de 10,700 descargas en casi 2 años.

SOAP::Lite provee clases para implementar funcionalidades de un cliente SOAP, varios servidores, soporte a datos y muchas otras tareas. La siguiente es una lista resumida de sus características:

Soporte de Protocolos

  • Soporta las especificaciones SOAP 1.1 y SOAP 1.2.
  • Incluye XMLRPC::Lite, una implementación del protocolo XML-RPC en el lado del cliente y del servidor. Entre los protocolos de trasporte disponibles, están HTTP, SMTP, POP3 y TCP.
  • Soporta publicación y peticiones UDDI del lado del cliente, a través de un API.

Interoperabilidad

  • Se han realizado pruebas de interoperabilidad con diferentes implementaciones: Apache SOAP, Frontier, Microsoft SOAP, Microsoft .NET, DevelopMentor, XMethods, 4s4c, Phalanx, Kafka, SQLData, Lucin (en Java, Perl, C++, Python, VB, COM, XSLT).

Protocolos de Transporte

  • Provee implementaciones de servidores TCP con multiservidor “no-bloqueante”
  • Soporta transporte sobre Jabber, MQSeries y SMTP.
  • Provee compresión transparente para HTTP.
  • Soporta el protocolo HTTPS.
  • Provee soporte para proxy.
  • Provee implementaciones de servidor POP3.
  • Soporta M-POST y redirección HTTP.

Soporte para WSDL

  • Soporta el esquema WSDL con “stub” y acceso en tiempo de ejecución. Soporta descripciones de servicio por directivas y cortas (tModel).

Otras

  • Provee implementaciones de servidores CGI, daemon, mod_perl, Apache::Registry yFastCGI.
  • Incluye los módulos de Apache mod_soap y mod_xmlrpc, los cuales permiten crear servidores SOAP o XML-RPC con algunas líneas en los archivos .htaccess o httpd.conf.
  • Soporta el enlace dinámico y estático de clases y métodos.
  • Provee un intérprete de comandos para sesiones SOAP interactivas.
  • Incluye una gran cantidad de ejemplos.

WSDL::Generator

WSDL::Generator es un módulo de Perl para crear archivos de descripción de servicios (WSDL) automáticamente a partir de módulos de perl expuestos como servicios web. Éste módulo, desarrollado por Pierre Denis <pdenis@fotango.com>, es tal vez el único que se ha creado hasta ahora con ésta funcionalidad en el mundo de Perl. SOAP::Lite y WSDL::Generator en la Práctica

Ejemplo

A continuación, se muestra un ejemplo de la utilización del lenguaje Perl para exponer un servicio web sencillo. En la documentación de los módulos puede encontrarse una descripción extendida de todas las funcionalidades que poseen y cómo utilizarlas.

El siguiente es el código fuente de un módulo de Perl que implementa una clase llamada “Cafetera”, con un único método llamado “prepararCafe”, que recibe como parámetro el número de tasas y devuelve como resultado un mensaje indicando el número de tasas preparadas:

Código del archivo Cafetera.pm <perl>

#!/usr/bin/perl -w
# Servicio web de ejemplo
package Cafetera;
use strict;
# Este es el constructor
sub new{
 my $proto = shift;
 my $class = ref($proto) || $proto;
 my $tasas = 0;
 bless($tasas,$class);
}
sub prepararCafe{
 shift;
 my $tasas = shift;
 print STDERR "Llamado con el parámetro $tasas";
 return "Se prepararon ".$tasas." tasas";
}
1;

</perl> A continuación se muestra el uso del módulo SOAP::Lite para exponer el módulo Cafetera como un servicio web, usando el servidor tipo SOAP::Transport::HTTP::Daemon:

Código del archivo servidor.pl <perl>

#!/usr/bin/perl -w
# Servidor SOAP
use SOAP::Transport::HTTP;
use Cafetera;
#En el parámetro dispatch_to se especifica la ruta a los módulos disponibles
my $daemonio = SOAP::Transport::HTTP::Daemon
 -> new(LocalAddr => 'localhost', LocalPort => 8070)
 -> dispatch_to('/home/tesis/thewala/preparacion/P.5-IP/productos/servicio-en-perl','Cafetera')
;
print "La url del daemonio es:".$daemonio->url()." ";
$daemonio->handle();

</perl> Desde éste momento, cualquier aplicación puede empezar a consumir el servicio web, si sabe cómo invocarlo. A continuación se muestra un cliente del servicio hecho en Perl con SOAP::Lite:

Código del archivo cliente.pl <perl>

#!/usr/bin/perl -w
use strict;
use SOAP::Lite;
my $soap = SOAP::Lite
 ->uri('http://localhost:8070/Cafetera')
 ->proxy('http://localhost:8070/')
;
my $resultado= $soap->prepararCafe(5)->result;
print "Preparando cafe: ".$resultado." ";

</perl> Para que aplicaciones hechas en otros lenguajes o que no saben cómo invocar el servicio puedan acceder al mismo, se debe crear el archivo de descripción WSDL. A continuación se muestra el guión o “script” de perl que utiliza WSDL::Generator para crear el archivo WSDL:

Código del archivo generar-wsdl.pl <perl>

#!/usr/bin/perl -w
use WSDL::Generator;
my $init = {
 'schema_namesp' => 'http://localhost:8070/Cafetera.xsd',
 'services' => 'Cafetera',
 'service_name' => 'Cafetera',
 'target_namesp' => 'http://localhost:8070/Cafetera.wsdl',
 'documentation' => 'Servicio Web de Prueba',
 'location' => 'http://localhost:8070/Cafetera'
};
my $w = WSDL::Generator->new($init);
Cafetera->prepararCafe(5);
print $w->get(Cafetera);

</perl> La salida de este guión de Perl constituye el documento wsdl que debe ser publicado para que cualquiera pueda acceder al servicio Cafetera. La siguiente es la salida del guión, la cuál puede guardarse en el archivo Cafetera.wsdl:

Código del archivo Cafetera.wsdl <xml>

<?xml version="1.0"?>
<definitions
 name="Cafetera"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 targetNamespace="http://localhost:8070/Cafetera.wsdl"
 xmlns:tns="http://localhost:8070/Cafetera.wsdl"
 xmlns="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xsdl="http://localhost:8070/Cafetera.xsd">
<types>
 <xsd:schema targetNamespace="http://localhost:8070/Cafetera.xsd">
  <xsd:element name="prepararCafeRequest" type="xsd:string" />
  <xsd:element name="prepararCafeResponse" type="xsd:string" />
 </xsd:schema>
</types>
<message name="prepararCafeRequest">
 <part name="prepararCafeRequestSoapMsg" element="xsdl:prepararCafeRequest"/>
</message>
<message name="prepararCafeResponse">
 <part name="prepararCafeResponseSoapMsg" element="xsdl:prepararCafeResponse"/>
</message>
<portType name="CafeteraCafeteraPortType">
 <operation name="prepararCafe">
  <input message="tns:prepararCafeRequest" />
  <output message="tns:prepararCafeResponse" />
 </operation>
</portType>
<binding name="CafeteraCafeteraBinding" type="tns:CafeteraCafeteraPortType">
 <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
 <operation name="prepararCafe">
  <soap:operation style="document" soapAction=""/>
  <input>
   <soap:body use="literal"/>
  </input>
  <output>
   <soap:body use="literal"/>
  </output>
 </operation>
</binding>
<service name="Cafetera">
<documentation>
 Servicio Web de Prueba
</documentation>
<port name="CafeteraCafeteraPort" binding="tns:CafeteraCafeteraBinding">
 <soap:address location="http://localhost:8070/Cafetera"/>
</port>
</service>
</definitions>

</xml>

Referencias



El contenido del material publicado por nuestros columnistas es responsabilidad de sus autores.

Para saber más sobre la programación y naturaleza de nuestros artículos y columnas, haga clic aquí.