Oct 262014
 
Artículo Java

WSDL (Web Services Description Language) es una especificación del W3C para el acceso desde los clientes a los servicios ofrecidos por un servidor web a través del protocolo HTTP.

En WSDL se definen los servicios que ofrece el servidor y la manera de acceder a los mismos.

SOAP (Simple Object Access Protocol) es la especificación de un formato XML que establece la manera de representar los datos en los mensajes intercambiados entre el cliente y el servidor.

En este artículo se explica con un ejemplo sencillo la manera de implementar un servicio web que sigue el estándar WSDL/SOAP

1. Definición del servicio

En nuestro ejemplo, vamos a crear un servicio “AritmeticaServicio”, que ofrece a los clientes dos operaciones “sumar” y “restar”.

El cliente realizará la llamada al servidor, especificando la operación que desea realizar, y pasándole los argumentos requeridos.

El servidor entregará la respuesta, que en nuestro ejemplo es la suma de los dos argumentos recibidos si se ha solicitado la operación “sumar”, o bien la diferencia entre ambos si se ha solicitado la operación “restar”.

Comenzamos por definir formalmente el servicio que hemos descrito, en un documento en formato XML conforme a la especificación WSDL.

1.1. Definición de los tipos de mensaje intercambiados entre cliente y servidor

En primer lugar, definimos un tipo de mensaje “AritmeticaPeticion” que el cliente enviará al servidor. En nuestro ejempo, el cliente debe enviar dos argumentos “operando1” y “operando2”, que deben ser numéricos. En WSDL, la definición de este tipo de mensaje es de la forma:

También debemos definir el tipo de mensaje “AritmeticaRespuesta”, que el servidor entregará al cliente en respuesta a su petición. En este caso, el mensaje contendrá un único valor, que también debe ser numérico:

1.2. Definición de los tipos de petición que admite el servidor

En nuestro ejemplo, el servidor atenderá a peticiones para las operaciones “sumar” y “restar”. En WSDL, hay que definir formalmente estas operaciones, indicando el tipo de mensaje que deben recibir del cliente, y el tipo de mensaje de respuesta que deben entregar:

1.3. Definición del tipo de codificación a aplicar a los mensajes

Para cada una de las operaciones definidas previamente, hay que especificar el tipo de codificación que se aplicará a los mensajes.

En nuestro ejemplo, tanto los mensajes de entrada como los mensajes de salida de ambas operaciones serán codificados en formato SOAP.

En el documento WSDL, esto se indica mediante un elemento “<binding>”, de la siguiente forma:

1.4. Definición de los puntos de acceso al servicio

Por último, dado que el cliente se comunicará con el servidor mediante protocolo HTTP, hay que especificar las URLs de acceso al servicio.

En nuestro ejemplo, el acceso al servicio se realizará mediante una única url “http://ejemplo.com/test/wsdl/aritmetica_server”.

La definición en el documento WSDL es de la forma:

1.4. Documento WSDL completo

Los distintos elementos que se han presentado en los apartados anteriors deben ir dentro de un elemento “<definitions>” que incluye una serie de atributos que hacen referencia a las distintas especificaciones XML, WSDL, SOAP que utiliza.

Con esto, el documento WSDL completo “AritmeticaServicio.wsdl” para la definición del servicio “AritmeticaServicio” queda de la forma:

2. Implementación del servidor

Normalmente, el servidor se implementa dentro de un contenedor Java (Tomcat, Jetty,…) que se ejecuta en un servidor web Apache.

Aquí vamos a suponer que ya se dispone de un entorno Tomcat/Apache en el cual se instalará la aplicación que implementará la parte servidora de nuestro servicio WSDL.

2.1. Instalación de AXIS2

Desde la página de descargas de AXIS, descargamos el paquete de instalación de la distribución binaria estandar axis2-1.6.2-bin.zip (20 MB), y lo descomprimimos en el directorio en donde queramos que resida (p.ej., /opt/axis2-1.6.2). En el perfil del usuario que se va a utilizar para desarrollar la aplicación, definimos la variable de entorno AXIS2_HOME apuntando a dicho directorio.

Alternativamente, podemos ejecutar el fichero /opt/axis2-1.6.2/bin/setenv.sh para preparar el entorno de desarrollo

Desde la página de descargas de AXIS, descargamos también el paquete de instalación WAR “axis2-1.6.2-war.zip” (18.2 MB), y lo descomprimimos bajo el directorio de instalación de aplicaciones de la instalación de Tomcat (en nuestro caso, /usr/share/tomcat7/webapps)

Para comprobar que la aplicación se ha instalado correctamente, accedemos a la url http://localhost:8080/axis2:

Axis2-welcome

Opcionalmente, podemos pulsar sobre el enlace “Validate” para acceder a una página en la que se presentan los resultados de la prueba de validación de la instalación.

2.2. Instalación del servicio AritmeticaServicio

Creamos un directorio “AritmeticaServicio” para contener la aplicación en desarrollo. en dicho directorio, creamos el fichero “AritmeticaServicio.wsdl” con el contenido que se indica en el punto 1.4.

A continuación, generamos el entorno de desarrollo de la aplicación con la utilidad ‘wsdl2java’:

Después, compilamos a aplicación con “ant”:

El comando “ant” genera un fichero “build/lib/AritmeticaServicio.aar”, que movemos al directorio “services” de axis2:

Y con esto, podemos acceder a la url “http://localhost:8080/axis2/services/listServices”, y comprobar que el servicio “AritmeticaServicio” aparece en el listado de servicios:

AritmeticaServicio

2.3. Programación de la funcionalidad del servicio

Naturalmente, todavía tenemos que incorporar el código java que implementa la funcionalidad deseada para las operaciones “sumar” y “restar”.

El comando wsdl2java ha creado un fichero “src/aritmetica/AritmeticaServicioSkeleton.java” que contiene los esqueletos de las operaciones a editar para incluir dicho código.

Por ejemplo, en el interior de dicho fichero, encontramos el esqueleto de la operación “sumar”:

La clase “aritmetica.SumarResponse” del objeto que debe devolver el método “sumar” está definida en el fichero “src/aritmetica/SumarResponse.java”.

Del mismo modo, la clase “aritmetica.Sumar” a la que pertenece el objeto “sumar” que recibe como argumento el método “sumar”, también está definida en un fichero “src/aritmetica/Sumar.java”.

Examinando dichos ficheros, podemos editar el método “sumar” para que implemente la funcionalidad deseada:

De la misma manera, editamos el método “restar” en el mismo fichero AritmeticaServicioSkeleton.java, para implementar la funcionalidad deseada para la operación “restar”

Una vez modificado el código fuente, volvemos a generar el fichero “.aar” y a copiarlo al contenedor Tomcat:

2.4. Comprobar la funcionalidad del servicio

Para verificar que el servicio está operativo, debemos escribir un cliente que realice llamadas al mismo, y comprobar que recibe las respuestas correctas.

Para ello, podemos utilizar de nuevo el comando wsdl2java con la opción “-s”, de la forma:

Con la opción “-s”, wsdl2java crea un fichero “src/aritmetica/AritmeticaServicioStub.java”, que podemos utilizar como base para escribir el cliente.

A continuación, creamos un fichero “src/aritmetica/AritmeticaCliente.java” que hará uso del Stub, con el siguiente contenido:

A continuación lo compilamos con “ant”, y lo ejecutamos con la utilidad “axis2.sh” (que añade al CLASSPATH todas las librerías axis2 requeridas, antes de ejecutar el cliente en la máquina virtual java):

Con esto, comprobamos que el servicio funciona adecuadamente, y devuelve el resultado de la suma de los dos números.

Referencias

Documentación AXIS2

 Publicado por en 10:55 am

 Deja un comentario

(requerido)

(requerido)