La primera vez que me engañes sera culpa tuya;la segunda vez sera mia.
Proverbio árabe

Archivos en la categoría Web Services

Web Services - Integrar los clientes en Spring

Ya sabemos cómo publicar un servicio web y cómo construir un cliente que consuma dicho servicio partiendo del fichero descriptor del contrato.

Ahora integraremos el cliente del servicio que hemos desarrollado en un proyecto Spring.

Proyecto holamundoWSClienteSpringPodríamos partir de un nuevo proyecto dinámico web, holamundoWSClienteSpring, añadir spring.jar y spring-mvc.jar, y configurar el web.xml para utilizar Spring. O podemos partir del proyecto que ya construimos basándonos en Spring, holamundo.

Debemos añadir las librerías que hemos utilizado en los anteriores proyectos :

  • axis.jar
  • commons-discovery.jar
  • jaxrpc.jar
  • saaj.jar
  • wsdl4j.jar

Y necesitamos el interfaz del servicio, que podemos construir nosotros u obtenerlo como ya se ha mostrado a partir del fichero WSDL. Es el mismo que ya hemos utilizado, es.lycka.holamundoWS.webservices.HolaMundo :

package es.lycka.holamundoWS.webservices;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface HolaMundo extends Remote {

      public String getSaludoLycka (String nombre) throws RemoteException;

} 

Vale, ahora vamos a implementar un fichero xml con el formato de Spring para definir un bean de nuestro servicio web, es.lycka.holamundoWS.webservices.clientes.spring.application-context-ws.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

      <bean id="holamundoService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">

            <property name="wsdlDocumentUrl">

<value>http://localhost:8080/holamundoWS/services/HolaMundoImpl?WSDL</value>

            </property>

            <property name="namespaceUri">

<value>http://impl.webservices.holamundoWS.lycka.es</value>

            </property>

            <property name="serviceName">

                  <value>HolaMundoImplService</value>

            </property>

            <property name="portName">

                  <value>HolaMundoImpl</value>

            </property>

            <property name="serviceInterface">

<value>es.lycka.holamundoWS.webservices.HolaMundo</value>

            </property>

      </bean>

</beans>

Ya sólo nos queda construir el cliente, es.lycka.holamundoWS.clientes.spring.HolaMundoClienteSpring :

package es.lycka.holamundoWS.clientes.spring;

import java.rmi.RemoteException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import es.lycka.holamundoWS.webservices.HolaMundo;

public class HolaMundoClienteSpring {

      public static void main(String[] args) {

            String resultado;

            try {

                  ApplicationContext contexto = new ClassPathXmlApplicationContext("/es/lycka/holamundoWS/clientes/spring/application-context-ws.xml");

                  HolaMundo servicio = (HolaMundo)contexto.getBean("holamundoService");

                  resultado = servicio.getSaludoLycka("Jero");

                  System.out.println("resultado = " +resultado);

            } catch (RemoteException e) {

                  e.printStackTrace();

            }

      }

} 

Ejecutamos esta clase (con el servidor iniciado donde esté desplegado el servicio, y con conectividad entre las máquinas cliente y servidor) y en la consola deberíamos de ver :

resultado: Lycka te saluda, Jero.

Ver también

Web Services - Primeros pasos con Eclipse - Generar Cliente Servicio Web

Ya hemos publicado nuestro servicio web en un servidor. Ahora queremos generar un cliente que consuma este servicio.

Para ello utilizaremos las mismas herramientas descritas en la entrada sobre la generación del servicio web, y el fichero descriptor del contrato que se generó, HolaMundo.wsdl.

Generamos el cliente Servicio Web

Proyecto holamundoWSClienteNormalmente el cliente y el servidor estarán en distintas máquinas. Por eso crearemos un nuevo proyecto web dinámico, holamundoWSCliente. Introducimos las librerías que necesitamos y el fichero del contrato del servicio, HolaMundo.wsdl (yo lo meteré en una carpeta "doc").

Nos situamos sobre el fichero descriptor del contrato (HolaMundo.wsdl) y seleccionamos "Botón Derecho > Web Services > Generate Client". 

Se nos genera automáticamente las siguientes clases dentro del mismo paquete (es.lycka.holamundoWS.webservices.impl) que la implementación del servicio (HolaMundoImpl):

  • HolaMundoImpl
  • HolaMundoImplProxy
  • HolaMundoImplService
  • HolaMundoImplServiceLocator
  • HolaMundoImplSoapBindingStub

Consumir el servicio web

Generamos una clase cliente de este servicio web que acabamos de crear. Por ejemplo en un nuevo paquete es.lycka.holamundoWS.clientes creamos una clase HolaMundoCliente. Esta clase será muy simple :

package es.lycka.holamundoWS.clientes;

import es.lycka.holamundoWS.webservices.impl.HolaMundoImpl;

import es.lycka.holamundoWS.webservices.impl.HolaMundoImplServiceLocator;

public class HolaMundoCliente {

      public static void main(String[] args) {

            try {

                  HolaMundoImplServiceLocator holaMundoWSServiceLocator = new HolaMundoImplServiceLocator ();

                  HolaMundoImpl holaMundoWS = holaMundoWSServiceLocator.getHolaMundoImpl();

                  String resultado = holaMundoWS.getSaludoLycka("Jero");

                  System.out.println("resultado: " +resultado);

            } catch (Exception e) {

                  e.printStackTrace();

            }

      }

} 

Ejecutamos esta clase (con el servidor iniciado donde esté desplegado el servicio, y con conectividad entre las máquinas cliente y servidor) y en la consola deberíamos de ver :

resultado: Lycka te saluda, Jero.

Es tan bonito lo simple !

Ver también

Web Services - Primeros pasos con Eclipse - Generar Servicio Web

Herramientas necesarias

  • JDK. En esta demo utilizaré la 1.5
  • IDE Desarrollo. En esta demo utilizaré el Eclipse del MEC (Profiles > Public Profiles > Web (con 'W' mayúscula) > Eclipse+J2EE+WebTools[MEC]) de las descargas de yoxos. Este perfil ya contiene las herramientas necesarias para trabajar con los servicios web. La distribución "europa" del eclipse también nos vale.
  • Servidor de aplicaciones. En esta demo utilizaré Tomcat 5.5
  • Librerías para la aplicación web.
    • axis.jar
    • commons-discovery.jar
    • jaxrpc.jar
    • saaj.jar
    • wsdl4j.jar

Creación de los objetos de negocio

Los servicios web son en resumidas cuentas objetos de negocio reutilizables y compartidos.

Por tanto, nos creamos nuestro nuevo proyecto web dinámico, holamundoWS.

Lo primero que debemos crear es un interfaz para el servicio web con los métodos de negocio (es.lycka.holamundoWS.webservices.HolaMundo) y una clase que implemente dicho interfaz (es.lycka.holamundoWS.webservices.impl.HolaMundoImpl). En el ejemplo tendremos un método de negocio, getSaludoLycka.

El código para el interfaz, HolaMundo es :

package es.lycka.holamundoWS.webservices;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface HolaMundo extends Remote {

      public String getSaludoLycka (String nombre) throws RemoteException;

} 

El código para la implementación, HolaMundoImpl es :

package es.lycka.holamundoWS.webservices.impl;

import java.rmi.RemoteException;

import es.lycka.holamundoWS.webservices.HolaMundo;

public class HolaMundoImpl implements HolaMundo {

      public String getSaludoLycka(String nombre) throws RemoteException {

            return "Lycka te saluda, " + nombre + ".";

      }

} 

Generación del Contrato del Servicio (fichero wsdl) y Publicación del servicio

Con los plugins del Eclipse resulta muy simple.

Proyecto holamundoWSSobre la interfaz del servicio, HolaMundo, y seleccionamos "Pulsamos Botón Derecho del ratón > Web Services > Generate Web Services". Introducimos la ruta de la implementación de la interfaz (Service Implementation). Se nos da la opción qué queremos hacer con el servicio (develop, assamble, deploy, install, start, test) y con el cliente; de momento elegiremos iniciar el servicio (start) y no generar el cliente.

Pulsamos "Next".

En esta pantalla podemos seleccionar los métodos que publicaremos en el servicio web, y el nombre del fichero wsdl. Por comodidad lo renombraré a HolaMundo.wsdl.

Se nos genera, entre otros ficheros, el descriptor del contrato de servicio (Web Content > wsdl > HolaMundo.wsdl)

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://impl.webservices.holamundoWS.lycka.es" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://impl.webservices.holamundoWS.lycka.es" xmlns:intf="http://impl.webservices.holamundoWS.lycka.es" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!–WSDL created by Apache Axis version: 1.4

Built on Apr 22, 2006 (06:55:48 PDT)–>

 <wsdl:types>

  <schema elementFormDefault="qualified" targetNamespace="http://impl.webservices.holamundoWS.lycka.es" xmlns="http://www.w3.org/2001/XMLSchema">

   <element name="getSaludoLycka">

    <complexType>

     <sequence>

      <element name="nombre" type="xsd:string"/>

     </sequence>

    </complexType>

   </element>

   <element name="getSaludoLyckaResponse">

    <complexType>

     <sequence>

      <element name="getSaludoLyckaReturn" type="xsd:string"/>

     </sequence>

    </complexType>

   </element>

  </schema>

 </wsdl:types>

   <wsdl:message name="getSaludoLyckaResponse">

      <wsdl:part element="impl:getSaludoLyckaResponse" name="parameters"/>

   </wsdl:message>

   <wsdl:message name="getSaludoLyckaRequest">

      <wsdl:part element="impl:getSaludoLycka" name="parameters"/>

   </wsdl:message>

   <wsdl:portType name="HolaMundoImpl">

      <wsdl:operation name="getSaludoLycka">

         <wsdl:input message="impl:getSaludoLyckaRequest" name="getSaludoLyckaRequest"/>

         <wsdl:output message="impl:getSaludoLyckaResponse" name="getSaludoLyckaResponse"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="HolaMundoImplSoapBinding" type="impl:HolaMundoImpl">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="getSaludoLycka">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getSaludoLyckaRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getSaludoLyckaResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="HolaMundoImplService">

      <wsdl:port binding="impl:HolaMundoImplSoapBinding" name="HolaMundoImpl">

         <wsdlsoap:address location="http://localhost:8080/holamundoWS/services/HolaMundoImpl"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions> 

Testear el servicio web

Comprobemos que vamos bien, es decir, que el servicio se ha generado correctamente y está desplegado y disponible en nuestros servidor de aplicaciones. Nos situamos sobre el fichero descriptor del contrato (HolaMundo.wsdl) y seleccionamos "Botón Derecho > Web Services > Test with Web Services Explorer". 

Explorador de Servicios WebEn la pantalla que se nos abre, Explorador de Servicios Web, podemos navegar entre los distintos servicios publicados y sus métodos. Para probar nuestro método, getSaludoLycka, pulsamos sobre su enlace y le introducimos un nombre. Yo le introduciré "Jero". Y pulsamos en "Go".

En la ventana de status podemos ver los mensajes SOAP que nos ha generado la acción, tanto el que se enviaría del cliente al servidor como el resultado que envía el servidor al cliente. Y efectivamente en este último viaja el saludo que nos devuelve Lycka, "Lycka te saluda, Jero."

Dónde está desplegado el servicio ?

Un detalle importante que no he comentado hasta ahora es cómo sabrá el cliente dónde está desplegado el servicio ?

El contrato del servicio lo especifica (por defecto pone localhost:8080). Para nuestras pruebas funcionará si el cliente se ejecuta en la misma máquina que el servidor, pero de no ser así deberemos sustituir localhost:8080 por el nombre de la máquina servidor y el puerto por el que atienda.

<wsdlsoap:address location="http://localhost:8080/holamundoWS/services/HolaMundoImpl"/>

Ver también