====== Creación de servicios con la técnica Top-down ====== --- //[[pedrody@um.es|PEDRO DELGADO YARZA]] 2014/02/18 14:20// Para crear un servicio web propio el primer paso es diseñar el WSDL y los ficheros XSD necesarios para definir todas sus funcionalidades y tipos de datos. Este paso se puede realizar haciendo uso de los editores dispuestos en el IDE (Eclipse) para tal fin. Antes de comenzar la creación de un servicio web, hemos de decir que dichos servicios se exponen en la ruta **nombredelproyecto/services**. ===== Creación del servicio web ===== Una vez tengamos diseñados dichos ficheros deberemos situarlos en la carpeta **generacion->servicios_web->resources** {{ :fdw2.0:fundeweb2.0:gt:top1.png |}} Una vez creados los ficheros modificamos el fichero **build.properties** ajustando las siguientes propiedades: * **ws.wsdl.file**: Nos permite indicar la ruta local del fichero wsdl que queremos generar. * **ws.ns.to.package.1**: Nombre del paquete en el que queremos encapsular las clases Java que se generen. #Variables para GENERACION DE SERVICIOS WEB - JAX-WS - SOAP ws.wsdl.file=ConversorDivisa.wsdl ws.ns.to.package.1=org.umu.atica.wservices A su vez el uso de la propiedad **ws.ns.to.package.1** nos permite mapear las urn concretas que contiene el WSDL a los paquetes que queramos para oganizar mejor el código. Un ejemplo de esto sería: #Namespaces y paquetes JAVA asociados: # Namespace to package (1). Formato: namespace=NombrePaqueteJava ns.to.package.1=urn:umu:eadmin:servicios:archivo=atica.umu.servicios.archivo # Namespace to package (2). Formato: namespace=NombrePaqueteJava ns.to.package.2=urn:umu:eadmin:servicios:archivo:esquema=atica.umu.servicios.archivo.esquema Tras configurar el fichero lanzamos la tarea Ant que nos generará el servicio Web **ws.WSDLToJavaWebService.generate** la cual creará las clases y estructuras necesarias junto con un fichero plantilla de implementación del servicio que tendremos que rellenar con la lógica que queramos dar a cada método, el nombre del fichero de implementación será **Nombre del servicio web+"Impl"**. Todas estas clases se generan en la carpeta build del directorio servicios_web. {{ :fdw2.0:fundeweb2.0:gt:cli2.png |}} Una vez generado el código, lo copiamos dentro de nuestro proyecto web junto con el WSDL que hemos creado que estará contenido en la carpeta wsdl del directorio WEB-INF de nuestro módulo web. Una vez listo debemos modificar el fichero **sun-jaxws.xml** situado en el directorio **WEB-INF** de nuestro módulo web, para añadir el punto de acceso (end-point) a nuestro servicio web. {{ :fdw2.0:fundeweb2.0:gt:top3.png |}} Un ejemplo sería el siguiente: ... Tras dar de alta el end-point en este fichero el servicio web estará accesible cuando despleguemos el servidor. ===== Servicios web seguros ===== Si queremos que nuestro servicio web implemente algún tipo de seguridad, el proceso de creación será similar al anterior solo que tenemos que tener en consideración los requisitos que implicará el tipo de seguridad que queramos aplicar. Para conocer en mayor profundidad cómo implementar un mecanismo de seguridad en nuestro servicio web podemos consultar esta guía: [[http://www.ibm.com/developerworks/library/j-jws10/| WS-Security in Metro]] En esta guía se nos explica qué componentes se han de añadir a nuestros ficheros de configuración del servicio web: * ****: Nos permite establecer la política de seguridad que queremos implementar. * ****: Configura los parámetros de la política de seguridad que implementamos. Dentro de esta última debemos destacar una propiedad: * ****: Configura cómo vamos a validar las peticiones a nuestro servicio web. Para ello nos permite definir validadores, haciendo uso del tag **** donde mapeamos el validador a una clase Java de nuestro proyecto. Un ejemplo de clase Java que actúa de validador: public class ValidadorWS implements PasswordValidator { @Override public boolean validate( com.sun.xml.wss.impl.callback.PasswordValidationCallback.Request request) throws PasswordValidationException { PasswordValidationCallback.PlainTextPasswordRequest ptreq = (PasswordValidationCallback.PlainTextPasswordRequest) request; ... ... return resultadoDeValidación; } } Una vez hecho esto, nuestro servicio web tendrá una política de validación definida que nos permitirá asegurar que sólo determinados clientes acceden a nuestro servicio. ===== Referencias ===== * [[http://www.benchresources.net/metro-jax-ws-soap-based-web-service-using-top-down-approach/|Metro JAX-WS SOAP based Webservice using top-down approach]] * [[http://www.jtech.ua.es/ayto/sws/index.html|Introducción a los Servicios Web Seguros]] * [[https://javaee.github.io/metro/doc/user-guide/user-guide.html#ahici|Metro User Guide - WSIT Security]] * [[https://www.ibm.com/developerworks/library/j-jws10/index.html|Web Service Security with Metro]]]