PRÁCTICA 8 Servicios web con SOAP y Eclipse E l objetivo de esta práctica es invocar e implementar servicios web en Java desde el entorno Eclipse. La práctica está estructurada en tres partes según se esquematiza en la figura 1 (pág. 92): 1. Invocación de un servicio web disponible en Internet. 2. Realización de un nuevo servicio web. 3. Invocación de un servicio web desde otro servicio web. La primera parte consiste en descubrir la interfaz e invocar un servicio web ya existente en Internet (al que nos referiremos como servicio currency, de una manera genérica) que proporciona el coeficiente de cambio entre cualesquiera dos monedas. La segunda parte consiste en realizar un nuevo servicio web, denominado eurocalculadora, que calcula el cambio de una cantidad de dinero entre el euro y cualquier otra moneda. En una primera versión se aplicará un coeficiente de cambio fijo e igual a 1. Esto proporcionará resultados incorrectos, pero permitirá realizar el desarrollo completo de un servicio y comprobar su funcionamiento. La tercera parte de la práctica consiste en modificar el servicio web desarrollado en la segunda parte para que obtenga el coeficiente de cambio de servicio web descubierto en la primera parte de la práctica. Se trata de convertir un servicio en un cliente de otro servicio. DYA 91
Invocación de un servicio web disponible en Internet FIGURA 1. Estructura del servicio web eurocal 8.1.- Invocación de un servicio web disponible en Internet Se comenzará por crear un proyecto prj-soap que abarcará las tres partes de la práctica. Este proyecto debe ser de tipo Web -> Dynamic Web project. Se creará también un paquete eurocal, donde se ubicará todo el código que desarrolle. Para descubrir un servicio web de cambio de moneda debe seguir los pasos que a continuación se indican: 1. Importar el servicio: Import -> Web Services -> Web Service. Deberá especificar que debe lanzarse el Web Services Explorer que deberá examinar el registro UDDI de XMethods Registry. 2. Seleccionar el servicio denominado Currency Convertor. 3. Importar el fichero WSDL al workbench del proyecto prj-soap con el nombre CurrencyConvertor.wsdl, seleccionando la opción que se indica en la figura 2 (pág. 93). 4. Visualizar el fichero CurrencyConvertor.wsdl y observar la interfaz de este proyecto. La visualización gráfica de esta interfaz se muestra en la figura 3 (pág. 93) y puede observarse que dispone de interfaz HTTP e interfaz SOAP. 5. Probar la interfaz SOAP de este servicio utilizando el Web Services Explorer. Para ello deberá seleccionar en el menú contextual de este fichero Web Services -> Test with Web Services Explorer. Una vez seleccionada la interfaz SOAP aparecerá un formulario como el de la figura 4 (pág. 94). 92 Servicios web con SOAP y Eclipse
Invocación de un servicio web disponible en Internet FIGURA 2. El servicio Currency Convertor del registro de Xmethods. FIGURA 3. Interfaz del servicio Currency Convertor. En la tercera parte de la práctica necesitará invocar este servicio desde un programa Java. Para ello, necesitará crear unos stubs a partir del fichero WSDL que permitan realizar la invocación remota utilizando el protocolo SOAP. Para la creación de estos stubs se requiere: DYA 93
Creación de un Servicio web FIGURA 4. Prueba del servicio Currency Convertor con el Web Services Explorer 1. Seleccionar el fichero CurrencyConvertor.wsdl y en el menú contextual utilizar la opción Web Services -> Generate Client. Al final del proceso debe aparecer en el proyecto un paquete NET.webserviceX.www que debe contener los stubs generados. 8.2.- Creación de un Servicio web La creación de un servicio web en Eclipse puede realizarse siguiendo dos metodologías: Bottom up: partiendo de un objeto Java (Java bean) Top down: partiendo de una especificación en WSDL. En esta práctica se utilizara el desarrollo top down en el que se partirá del fichero de especificación del servicio en WSDL. Consta de los siguientes pasos: 1. Añadir al paquete eurocal un fichero WSDL denominado eurocal.wsdl: New-> Other -> Web Services -> WSDL. 2. Utilizar la interfaz gráfica de este fichero para especificar una interfaz del servicio como la de la figura 5 (pág. 95). 3. Generar los bindings o vínculos del servicio con las url donde se presta el servicio: Generate Binding Context. 4. Generar el servicio web. Para ello se debe seleccionar el fichero con la interfaz WSDL (eurocal.wsdl) y en el menú contextual utilizar la opción Web Services -> Generate java bean skeleton. Al final del proceso debe aparecer en el proyecto un paquete org.example.www.eurocal 94 Servicios web con SOAP y Eclipse
Invocación de servicios web desde programas en Java Generate Binding Context FIGURA 5. Interfaz WSDl del servicio eurocal que debe contener las plantillas del servicio y el esqueleto para su ejecución como servidor remoto con el protocolo SOAP. Al final de la generación del servicio se requerirá arrancar el servidor Jakarta Tomcat para ejecutar el servicio. Si se decide no arrancarlo en este momento, también puede ejecutarse un servicio web sobre este servidor utilizando la opción Run as -> Run on server. Aparece una ventana en la parte inferior del IDE denominada Server en la que se indica los servicios que está ejecutando el servidor. Se puede seleccionar alguno de estos servicios y borrarlo. La implementación del servicio se realiza en el fichero EurocalSOAPImpl.java del paquete org.example.www.eurocal. Cada vez que se realiza una modificación en este fichero y se salva, se regenera el servicio web y se rearranca el servidor Jakarta Tomcat para actualizar dicho servicio. Esta fase de la práctica terminará con la prueba de dicho servicio. Ello requiere: 5. Seleccionar en el menú contextual del fichero Web_Content/wsdl/eurocalSOAP.wsdl la opción Web Services -> Test with Web Services Explorer. 8.3.- Invocación de servicios web desde programas en Java En esta parte de la practica se indica como el servicio web eurocal puede invocar el servicio web currency (actualmente se utiliza Currency Convertor) para obtener el coeficiente de cambio entre el euro y cualquier otra moneda. La técnica es semejante a los demás mecanismos de invocación remota vistos con anterioridad (Java-RMI y CORBA): a partir del fichero de especificación del servicio en WSDL se generan los stubs necesarios par canalizar la invocación remota sobre el protocolo SOAP. DYA 95
Ficheros de apoyo Este paso ya se realizó en la primera parte de esta práctica (seleccionar el fichero CurrencyConvertor.wsdl y en el menú contextual utilizar la opción Web Services -> Generate Client). El resultado es un paquete NET.webserviceX.www con los stubs generados. Los ficheros mas significativos son: CurrencyConvertorSoap.java: es el stub de la clase correspondiente al servicio. Currency.java: es una clase que enumera las diferentes monedas. CurrencyConvertorLocator.java: clase que sirve para obtener ubicar y obtener una referencia al stub del servicio. Solo resta realizar la invocación remota desde el servicio eurocal. Para ello debe modificar el fichero EurocalSOAPImpl.java del paquete org.example.www.eurocal tal como se indica a continuación. 8.4.- Ficheros de apoyo 8.4.1.- Fichero de implementación del servicio SOAP en Java Fichero EurocalSOAPImpl.java package org.example.www.eurocal; import javax.xml.rpc.serviceexception; import NET.webserviceX.www.Currency; import NET.webserviceX.www.CurrencyConvertorLocator; import NET.webserviceX.www.CurrencyConvertorSoap; public class EurocalSOAPImpl implements org.example.www.eurocal.eurocal_porttype{ CurrencyConvertorLocator service; CurrencyConvertorSoap stub; public EurocalSOAPImpl() { service = new CurrencyConvertorLocator(); try { stub = service.getcurrencyconvertorsoap(); catch (ServiceException e) { e.printstacktrace(); 96 Servicios web con SOAP y Eclipse
Ficheros de apoyo public double convertiraeuros(java.lang.string codi, double moneda) throws java.rmi.remoteexception { double rate = stub.conversionrate(currency.fromstring(codi), Currency.EUR); return (moneda*rate); public double convertireuros(java.lang.string codi, double euros) throws java.rmi.remoteexception { double rate = stub.conversionrate(currency.eur, Currency.fromString(codi)); return (euros*rate); DYA 97
Ficheros de apoyo 98 Servicios web con SOAP y Eclipse