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.
Sobre 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".
En 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