Spring WS: Construcción de Clientes de Servicios Web con Spring

1
16691

Spring WS: Construcción de Clientes de Servicios Web con Spring

En el siguiente tutorial vamos a ver algunas de las aportaciones que nos ofrece Spring en relación a la construcción de clientes
de servicios web.

Se presupone que el lector ya posee conocimientos de Servicios Web, Maven y Spring.

Si estás interesado en la construcción de servicios web con Spring, puedes ver el siguiente tutorial

Índice de contenido:

  1. Introducción.
  2. Ejemplo de construcción de un cliente de servicio web con Spring.
    1. Entorno.
    2. Describiendo la petición y la respuesta de comunicación con el servicio web.
    3. Código fuente del cliente.
    4. Archivo de configuración de Spring 2 (/main/resources/applicationContext.xml).
    5. Archivo de configuración de Maven 2: pom.xml.
    6. Configuración de logs para monitorizar el tráfico SOAP: /main/resources/log4j.xml.
    7. Invocación del servicio Web.
  3. Referencias
  4. Conclusiones

Introducción

Al igual que en otros temas en Spring como JMS o DAO, Spring apuesta por el uso de plantillas que nos ahorren tener que
realizar las tareas comunes evitándonos además cometer ciertos errores ligados a estas partes.

Por ejemplo, en el caso de DAO, las plantillas nos evitan tener que abrir conexiones, liberar recursos, etc.

En el caso de los servicios web, Spring nos proporciona la plantilla org.springframework.ws.client.core.WebServiceTemplate a tráves de la cual podremos enviar
mensajes (payload) a un servicio Web, y será la plantilla la que se encarge de envolverla en sobres SOAP, de establecer conexiones, liberar recursos, controlar errores de obligada captura, etc.

Además esta plantilla nos proporciona imnumerables métodos para enviar mensajes con cualquier tipo de mensajería y médio transporte.

Cabe destacar que para construir un cliente de un servicio web usando Spring necesitas entender el WSDL que define el servicio web, es decir:

  • Protocolo de comunicación.
  • Dónde escucha la peticiones.
  • Formatos peticiones, respuestas y fallos.

Entender un WSDL no es tan dificil como a veces se puede pensar, en un par de tardes con ganas los lees sin problemas 🙂

Nuestro cliente usará por dentro una instancia de WebServiceTemplate (normalmente inyectada por Spring) y está plantilla se deberá de configurar dos parámetros (en la configuración de Spring):

  1. La fábrica de mensajes SOAP: Envuelve el Payload que envias a través de la plantilla en sobres SOAP Envelope.
  2. La clase de envio de menssajes SOAP: Se encarga del envio en si del mensaje construido anteriormente.

Tendrás información más detallada en los comentarios del archivo de configuración de Spring que se verá más adelante en este mismo tutorial.

Ejemplo de construcción de un cliente de servicio web con Spring:

A continuación vamos a ver un completo ejemplo en donde construiremos un cliente para el Servicio Web de búsqueda de libros que definimos en un tutorial anterior. Ver tutorial.

El código fuente de este tutorial puede ser descargado desde aquí (proyecto Eclipse con Maven 2).

Entorno

El siguiente ejemplo está construido en el siguiente entorno:

  • HP Pavilion.
  • Windows Vista Home Premium.
  • Eclipse Ganymede.
  • Java 6.
  • Maven 2.
  • Plugin Maven 4QE para Eclipse.

Describiendo la petición y la respuesta de comunicación con el servicio web:

Spring SÓLO APUESTA por el modelo contrato-primero (Contract-First), por lo que debemos de enviar y recibir la información con el formato que se especifique en el contrato del servicio Web (WSDL).

A continuación vemos el formato de datos de la comunicación con el servicio web y al cual debemos ceñirnos estrictamente.

Código fuente del cliente:

com.autentia.tutoriales.spring.ws.biblioteca.cliente.BibliotecaCliente:

com.autentia.tutoriales.spring.ws.biblioteca.cliente.Libro:

Archivo de configuración de Spring 2 (/main/resources/applicationContext.xml):

El archivo está autocomentado.

Archivo de configuración de Maven 2: pom.xml:

A continuación exponemos el archivo de configuración de Maven, se presupone que el lector ya tiene nociones de Maven.

Configuración de log para monitorizar el tráfico SOAP: /main/resources/log4j.xml:

Invocación del servicio Web:

A continuación nos creamos un test funcional con JUnit para probar la invocación y respuesta del servicio Web.

com.autentia.tutoriales.spring.biblioteca.cliente.test.BibliotecaTest:

Y para terminar, ejecutamos los tests y vemos la salida generada mvn test:

Vemos los logs que nos ha dejado la aplicación (bibliotecaWSClienteSOAP.log):

Referencias

Conclusiones

Si lo piensas bien, este forma de comunicación con servicios Web puede parecer que requiere un gran esfuerzo en comparación con otras técnicas, pero no es para tanto, usando técnicas
OXM (Object XML Mapping) y el uso de plantillas (WebServiceTemplate) el esfuerzo se reduce enormemente y lo que es mejor, para las personas que nos gusta tener el control sobre lo que está pasando, esta solución es ideal,
pues todo son mensajes en XML fácilmente depurables.

Otra cosa, recuerda que esto no es más que un tutorial, hay más puntos al respecto sobre los que profundizar.

En Autentia impartimos constantemente cursos a medida sobre estas y otras tecnologías, espero nos tengais en cuenta en caso de que necesiteis formación.

Un saludo, espero que os haya parecido útil este tutorial.

Carlos García. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

1 Comentario

  1. Hola, lo primero de todo, gracias por el tutorial. Es muy bueno.

    Aplicando dicho tutorial a mi aplicación, resulta que cuando ejecuta la línea:

    boolean hayRespuesta = webServiceTemplate.sendSourceAndReceiveToResult(URI, peticion, respuesta);

    realiza la petición al WS, y devuelve la respuesta (lo veo a través del log de SOAP), pero resulta que \\\»respuesta\\\» está a null e incluso, la variable \\\»peticion\\\», que antes contenía el string de la peticón xml, ahora también está a null. ¿Alguna sugerencia?

    Gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here