G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!

Mi primera experiencia con Apache Axis
Por Rob Tougher
Traducción al español por Julio César Mejía Terán
el día 11 de Noviembre 2003, para La Gaceta de Linux

 

Introducción

Paso mucho de mi tiempo libre aprendiendo tecnologías nuevas (y antiguas). En parte porque quiero mejorar como desarrollador de software, pero principalmente porque soy un geek y creo que es divertido. Pienso que la mayor parte de los desarrolladores de software pasan por lo menos algo de su tiempo enriqueciendo su oficio.

Decidí ver en Apache Axis para mi más reciente proyecto. Apache Axis es una implementación de fuente abierta del Protocolo de acceso a objeto simple [Simple Object Access Protocol], o SOAP. Básicamente, SOAP provee un protocolo estandarizado para transmitir datos entre máquinas (El intercambio de datos en un entorno distribuido no es un concepto nuevo - Yo he usado COM, CORBA y sockets BSD puros para enviar datos de una máquina a otra. En realidad, mi primer artículo para Gaceta de Linux fue sobre programación con sockets en C++).

El objetivo de este proyecto fue crear un servicio web simple, y crear consumidores de este servicio web en Java y Python. Este artículo detalla mis pasos en el alcance de este objetivo.

Instalación

Mi primer paso fue configurar mi entorno de desarrollo. Decidí usar dos máquinas para este proyecto - mi servidor Debian y mi Powerbook. Supuse que podría usar mi Powerbook para compilar archivos de clases Java usando Eclipse, y poner estos archivos de clases a una instancia de Tomcat y Axis ejecutándose en el servidor Debian. Ya tenía Eclipse y el último SDK Java instalado en la Powerbook, así que estuvo lista. No tenía idea de cual era el estado de mi máquina Debian, de tal manera que tuve que hacer algo de trabajo detectivesco antes de proceder.

Primero fue Java. me introduje a mi caja Debian con ssh y verifiqué mi entorno. Para una instalación Java la variable de entorno JAVA_HOME tiene que ser ajustada, así que supuse que podría ser el primer lugar a verificar. invoqué a "set", miré la salida, y no pude encontrar la variable. Luego vi mi archivo .bashrc, y note que JAVA_HOME estaba siendo ajustada, raro. Así que .bashrc no estaba invocándose. Tal vez sshd no llama a tus archivos bash? escribí "bash" en la línea de ordenes, presioné return, escribí "set", y la propiedad JAVA_HOME se mostró. Así que supongo que ssh no ejecuta las cosas de bash. ejecuté "java -version", y me devolvió "1.4.1_01", bien. Entonces fui al sitio de Java, y me dí cuenta que la versión 1.4.2 del SDK para Java fue liberada! Así que tuve que instalar Java. descargué el archivo .bin a mi Powerbook, copié éste con scp a mi caja Debian, cambié sus atributos con chmod, lo ejecuté y luego actualice la declaración de la variable de entorno en mi archivo .bashrc. Una última verificación, "java -version", retornó 1.4.2. La instalación de Java fue completada.

El siguiente fue Tomcat. Tomcat es un contenedor servlet J2EE que está alojado en el sitio de Jakarta Apache. La instalación de Tomcat fue igual de fácil. Descargué Tomcat 4.1.27 del sitio web principal, copié éste con scp a mi caja Debian, y lo descomprimí en mi directorio ~/apps . Luego, por la documentación en línea, simplemente ejecuté bin/startup.sh, y leí el puerto 8080 de mi caja Debian usando Mozilla. Éxito! tuve experiencia con el contenedor servlet anteriormente, así que no estaba preocupado por ésto.

Luego fue Eclipse. Eclipse es un IDE de fuente abierta que IBM ha desarrollado. Decidí que podría ejecutar Eclipse en mi Powerbook para compilar cualquier archivo Java necesario, y transferir éste a la caja Debian. pude tener Eclipse ejecutándose en mi caja Debian fácilmente (y he usado Eclipse en mi máquina Linux en el trabajo), pero mi caja Debian funciona sin cabeza [no tiene monitor], de tal manera que tendría que usar Eclipse a través de mi servidor X de la Powerbook. No es la configuración más rápida, así que solo hice click en mi icono de Eclipse en mi escritorio y voila, Eclipse estuvo funcionando en mi Powerbook (de hecho, estoy escribiendo este artículo ahora mismo usando JEdit en mi Powerbook).

Una de las razones por las que me gusta Java es que puedo compilar código fuente Java en una arquitectura y poner el código en cualquier otra arquitectura que soporte Java. Para mi sitio web compilo código Java en mi Powerbook y lo pongo en una máquina Sun, y mi último proyecto en el trabajo requería que yo compile en mi máquina Linux y coloque en entornos Sun y Linux.

Después fue Axis. Descargué Axis del sitio principal, lo copié a mi caja Debian, lo descomprimí y copié el directorio "axis" de la distribución a mi directorio webapps de Tomcat. Después de reiniciar Tomcat, leí http://debianbox:8080/axis con mi navegador, y recibí la página inicial de Axis. Éxito!

El último, pero no el menos importante. Necesité una manera para llamar servicios SOAP usando Python. nunca he utilizado SOAP con Python, así que no estaba consciente de ningún proyecto que haya realizado ésto. Mi primer paso fue hacer una verificación rápida en mi máquina Debian invocando a "apt-cache search soap". me devolvió el paquete "python-soappy". Así que instalé éste, y encontré el archivo nuevo en /usr/lib/python2.1/site-packager.

Y eso fue. La instalación sucedió sin problemas.

Servicio web simple

Mi próximo paso en el proyecto fue crear un servicio web simple. Un primer programa no puede estar completo sin un "Hola Mundo" en algún lugar dentro de él, así que decidí usar el siguiente código fuente Java:

public class HelloWorldService
{
	public String HelloWorld(String data)
	{
		return "Hola Mundo! enviaste la cadena '" + data + "'.";
	}
}

Después tuve que registrar este código fuente en Axis. Pasé algún tiempo leyendo los documentos de Axis y me enteré que hay dos maneras básicas de registrar servicios web - una forma fácil y rápida que tiene algunas restricciones, y una forma larga y minuciosa que es más flexible:

La forma minuciosa se ve simple, pero decidí para los propósitos de este artículo que puedo seguir el camino rápido. Dejaré que el lector experimente con los WSDD's.

Regresando al ejemplo, tenía el código fuente Java anterior que quise registrar en Axis. Así que cambié la extensión de mi archivo a *.jws y lo moví al directorio Axis. Entonces probé ver que el servicio fue instalado navegando a la dirección del servicio:

Recibí una página HTML diciendo que había un servicio instalado en ese lugar. Éxito! Fui un paso más allá tratando de llamar mi método HelloWorld:

Recibí el XML de la llamada al método. La llamada se completo exitosamente!

Cliente Java

Crear el servicio web resultó ser muy simple. Mi siguiente tarea fue crear un cliente Java que pueda llamar al servicio.

El siguiente es el código fuente para mi cliente Java:

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class HelloWorldClient
{
	public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException
	{

		Service service = new Service();

		Call call = (Call)service.createCall();
		call.setTargetEndpointAddress(new URL("http://debianbox:8080/axis/HelloWorldService.jws"));
		call.setOperationName(new QName("http://soapinterop.org/", "HelloWorld"));

		String returnValue = (String)call.invoke(new Object[]{"Mi nombre es Rob."});

		System.out.println(returnValue);
	}
}

Encontré este código como parte de la documentación de Axis. ¿Quién dice que el copiar y pegar anti-patrones es malo? :)

Para lograr compilar el cliente Java he configurado un proyecto Eclipse. creé un proyecto llamado "AxisTest", e importé los archivos axis.jar, jaxrpc.jar, commons-logging.jar, common-discovery.jar y saaj.jar de la distribución Axis. Después de compilar el archivo fuente, ejecuté éste y recibí datos desde el servicio. El cliente Java fue un éxito.

Cliente Python

Ya que SOAP es independiente del lenguaje, pensé que debería ser capaz de crear un cliente Python para llamar a mi servicio web. Hice una búsqueda rápida en Google y encontré el sitio principal de Python Web Services. Miré el README para SOAPPY, y encontré un ejemplo parecido a lo siguiente:

#!/usr/bin/env python

import sys
import SOAP

remote = SOAP.SOAPProxy(
		"http://debianbox:8080/axis/HelloWorldService.jws",
		"",
		"")

result = remote.HelloWorld("My name is Rob.")
print result

Ejecuté éste en mi caja Debian y recibí el mensaje correcto desde mi servicio Axis.

Resumen

Estoy feliz con el resultado de mi experimento con Axis de Apache. Alcancé todos los objetivos que me fijé al principio, y saqué la conclusión que Axis es una excelente forma para intercambiar datos entre máquinas en un entorno distribuido.

 

[BIO PEN] Rob es un desarrollador de software en la ciudad de Nueva York.


Copyright © 2003, Rob Tougher. Copying license http://linuxgazette.net/copying.html
Publicado en el número 96 de Gaceta de Linux, Noviembre 2003