Web Services JAX-RS RESTful y SOAP

Embed Size (px)

Citation preview

Prctica V: Web Services JAX-RS RESTful y SOAP

EQUIPO DE TRABAJO:

0-Cdigo de la Prctica Web Services 2016

La aplicacin esta compuesta por dos proyectos:

APITwitterTagV2 (Servidor Web)

JAXClient (Cliente)

Pueden ser descargados del repositorio SVN de la UNED accediendo a:http://62.204.199.127/JAVA_UNED/alef/browser/UNED_2016/J2EE/APITwitterWS/trunk

Descarga del cdigo del repositorio mediante TortoiseSVN (https://tortoisesvn.net/downloads.html)Nuestro compaero Jose, realiz un vdeo explicativo para poner en marcha ambas aplicaciones partiendo del repositorio. Es importante recalcar, que las librerias necesarias son descargadas con el proyecto y debemos configurar nuestro "Build Path" de acuerdo a lo indicado en el video: http://62.204.199.127/alef/UNED_2016/J2EE/APITwitterWS/19563377-sesionPruebas.ogv.bin

Descarga de la BBDD del repositorio en:

https://62.204.199.127/alef/UNED_2016/J2EE/APITwitterWS/apitwitter.sql

1-Punto de partidaLa aplicacin en su conjunto esta formada por dos proyectos y una BBDD:

ApiTwitterTagV2 Servidor de servicios.

JAXClient Consumidor de servicios.

Apitwitter.sql BBDD en la que se almacena informacin sobre Tweets (extrados con anterioridad de la API de Twitter) y Estudios Clnicos (extrados con anterioridad de la API de ClinicalTrials) mediante el Crawler ApiTwitter.

NOTA: Para ms informacin sobre el funcionamiento del Crawler o Robot consultar: http://62.204.199.127/JAVA_UNED/alef/wiki/2016_practica_APITwitter

2-Servicios Web

Se han desarrollado cinco servicios Web: Recuperar Tweets partiendo de un Hashtag elegido por el Cliente.

Recuperar un Tweet partiendo de su Id. Cada Tweet dispone de un identificador nico. Este es seleccionado por el Cliente (consumidor del servicio) y el Servicio Web recupera el Tweet correspondiente.

Recuperar Estudios Clnicos partiendo de un Hashtag elegido por el Cliente. Para no extender este documento, nos centraremos en la explicacin de este servicio en su dos metodologas: Restful y Soap.

Recuperar un Estudio Clnico partiendo de su NCT. Cada Estudio Clnico dispone de un identificador nico (nct). Este es seleccionado por el Cliente (consumidor del servicio) y el Servicio Web recupera el Estudio Clnico correspondiente.

Recuperar Hashtag vecinos partiendo de un Hashtag seleccionado por el Cliente (consumidor del servicio). El Servicio Web recupera un listado de Hashtags vecinos.Nota: Dado un Hashtag concreto podemos localizar Tweets relacionados. Dentro de estos Tweets tambin existen nuevos Hashtags que nos llevarn a su vez a nuevos Tweets relacionados con un tema concreto. A estos Hashtags los denominamos Neighbour (vecinos)

3-Estudios Clnicos partiendo de un Hashtagweb.xml RESTfulEl archivo web.xml se encuentra en la ruta WebContent/Web-INF

Para aadir los servicios RESTful es necesario indicar:

El provider JAX-RS de referencia, jersey

Las aplicaciones jersey

Los mappings para ejecutar los servicios JAX-RS

4-Recuperar Estudios Clnicos partiendo de un HashtagRESTful

Esquema de paquetes empleados en Servidor (APITwitterTagV2):

4.1 uned.java2016.apitwitter.dao4.2 uned.java2016.apitwitter.services.rs (RESTful)

4.2.1 uned.java2016.apitwitter.services.rs.EstudioService.java4.2.2 uned.java2016.apitwitter.services.rs.RSApplication.java

4.3 uned.java2016.apitwitter.services.rs.filters (RESTful)4.4 uned.java2016.apitwitter.services.rs.jaxb (RESTful)

4.1 uned.java2016.apitwitter.dao

En este paquete se estable el [Objeto de Acceso a Datos] denominado: Estudio Clnico

Dicho objeto tiene tanto los atributos como los mtodos necesarios para la gestin de la informacin extrada de un Estudio Clnico.

Destaca nctId en su papel de identificador unvoco.

Las clases de este paquete sern requeridas por el servicio WEB para lograr la funcionalidad.

4.2 uned.java2016.apitwitter.services.rs RESTful

Se crea la clase EstudiosService.java.

Dicha clase implementa el Servicio Web 'estudios'

Se publica en el path 'estudios' bajo el que opera Jersey

4.2.1 uned.java2016.apitwitter.services.rs.EstudiosService.java

Nos centramos en la clase EstudiosService.java:

Programacin (RESTful) mediante anotaciones en Java:

@GET

@Path("/getByHashtag/{ht: [a-zA-Z]+}/{count: [0-9]{1,2}}")

@Produces({MediaType.APPLICATION_XML})

Mtodo getEstudioRecupera los estudios que contienen el hashtag elegido por el usuario Parmetros:

@param ht Hashtag

@param count Numero de estudios a recuperar

@return Estudios que contienen el hashtag 'ht'

4.2.1uned.java2016.apitwitter.services.rs.EstudiosService.java

Detalle del mtodo getEstudio:

4.2.2 uned.java2016.apitwitter.services.rs.RSAplicattion.java

Se aade nuestro servicio a los ya existentes en la clase RSAplicattion.java:

4.3 uned.java2016.apitwitter.services.rs.filters (RESTful)

Filtro de autenticacin para todos los servicios RESTful.

Espera una cabecera 'Authorization' con las credenciales segn el esquema :

Accede a la BBDD y comprueba si el usuario tiene perfil 'adm'.

Si no, aborta la ejecucin de la llamada al WS y devuelve el error 401 UNAUTHORIZED

4.4 uned.java2016.apitwitter.services.rs.jaxb (RESTful)

Se aade la clase llamada Estudios.java

Guarda un grupo de estudios para su uso con jaxb.

5-Recuperar Estudios Clnicos partiendo de un HashtagSOAP5.1 Implementar el servicio JAX-WS con el modelo de Servlet.

Existen dos mtodos para implementar el desarrollo en Soap:

Partir de una clase Java que implemente el servicio Web.

Un fichero WSDL (formato XML que describe un servicio Web).

En nuestro caso hemos elegido la primera opcin.

5.2 Esquema de paquetes y clases

Se han introducido dos nuevos paquetes para desarrollar los Servicios Web SOAP:

5.2.1 uned.java2016.apitwitter.services.soap

5.2.1.1 uned.java2016.apitwitter.services.soap.EstudioServiceImpl.javaClase EstudioServiceImpl.java (Detalle Mtodo getByHashtag)

5.2.1.2 uned.java2016.apitwitter.services.soap.EstudioService.java (Interface)

5.2.2 uned.java2016.apitwitter.services.jaxws

5.2.1.1 uned.java2016.apitwitter.services.soap.EstudioServiceImpl.java

Se ha creado la siguiente clase para implementar el servicio Web:

Clase EstudioServiceImpl.java

La clase EstudioServiceImpl.java con la anotacin @WebService tiene dos mtodos de implementacin:

1- Define un SEI (Service Endpoint Interface) de forma implcita por lo que no ser necesario proporcionar dicha interfaz.

2- Especificando de forma explcita una interfaz aadiendo el atributo endpointInterface a la anotacin @WebService. En ese caso, s es necesario proporcionar la interfaz que defina los mtodos pblicos disponibles en la clase que implementa el servicio.

La anotacin @WebService no precisa que se especifique la ubicacin del WSDL. Si se utiliza el atributo wsdlLocation en la anotacin @WebService, el fichero WSDL debe ser empaquetado junto con las clases java del servicio web.

En la variable context, se inyectar un objeto WebServiceContext. De esta forma tendremos acceso al contexto del servicio. Como el servicio es un componente web, a travs de este objeto podremos tener acceso a componentes de la API de servlets como a la peticin HTTP (HttpServletRequest), la sesin (HttpSession), etc.

Clase EstudioServiceImpl.java (Detalle Mtodo getByHashtag)

Detalle del mtodo getByHashtag:Mediante el mtodo getByHashtag se accede a la BBDD mediante los mtodos del DAO y se retorna una lista de los Estudios Clnicos partiendo de un Hashtag elegido por el usuario.El mtodo getByHashtag dispone de los parmetros de entrada:

ht Hashtag (String de bsqueda en la BBDD)

count Nmero de Objetos Estudios a recuperar

El mtodo devuelve Estudios que contienen el Hashtag 'ht'.5.2.2.2 uned.java2016.apitwitter.services.soap.EstudioService.java

Interfaz EstudioService.java

La clase EstudioServiceImpl.java implementa el interface EstudioService.java creado previamente:

5.3 Despliegue del servicio web en el Servidor

Define la configuracin del despliegue en los ficheros:

4.3.1 web.xml 4.3.2 sun-jaxws.xml

Se utiliza el modelo de despliegue especfico de JAX-WS RI, que define la configuracin del despliegue en los ficheros web.xml y sun-jaxws.xml.

Se trata de un despliegue sin descriptores, por tanto la implementacin de nuestro servicio web no sera "descubierta" automticamente por el contenedor (por ejemplo Tomcat).

Debemos incluir descriptores de despliegue para "decirle" a la librera JAX-WS cmo queremos que se desplieguen nuestros servicios web.

En nuestro caso, que utilizamos Tomcat, tendramos que aadir en el directorio WEB-INF los ficheros sun-jaxws.xml y web.xml. Ambos ficheros contendrn informacin para realizar el "despliegue" de los servicios web.

5.3.1 web.xml

En el fichero web.xml declaramos el listener JAX-WS WSServletContextListener, que inicializa y configura el endpoint (componente port) del servicio web, y el servlet JAXWS WSServlet, que es el que sirve las peticiones al servicio, utilizando la clase que implementa dicho servicio. El contenido de nuestro fichero web.xml quedara as:

5.3.2 sun-jaxws.xml

El fichero sun-jaxws.xml contiene la definicin de la implementacin del endpoint del servicio. Cada endpoint representa un port WSDL, y contiene toda la informacin sobre la clase que implementa el servicio, url-pattern del servlet, informacin de binding, ubicacin del fichero WSDL, y nombres "cualificados" (qualified names) del port y service del WSDL. Si no especificamos la ubicacin del fichero WSDL, ste ser generado y publicado durante el despliegue. En el siguiente fichero sun-jaxws.xml indicamos que la implementacin de nuestro servicio viene dada por la clase uned.java2016.apitwitter.services.EstudioServiceImpl.java (dicha clase debe estar anotada con @WebService).

5.3.3 Herramienta de despliegue wsgen y generacin de clases

La herramienta de despliegue comienza el proceso examinando el artefacto desplegado para determinar qu mdulos contienen servicios Web, para ello analiza las anotaciones de servicios web o los descriptores de despliegue contenidos en el mdulo. A continuacin, obtiene la informacin de enlazado (binding), despliega los componentes y servicios web definidos en el mdulo. Seguidamente publica los documentos WSDL que representan a los servicios web desplegados, configura al servidor e inicia la aplicacin.

wsgenherramienta para generar servicios web a partir de una clase java.

Proceso:

Lo primero que deberemos hacer es compilar la clase que implementa el servicio al igual que cualquier otra clase Java, con la herramienta javac.

Generaremos el servicio con wsgen a partir de la clase compilada. Sobre la lnea de comandos lanzamos la herramienta wsgen del siguiente modo: wsgen -cp -s -d

La clase que implementa el servicio () se especificar mediante su nombre completo, es decir, incluyendo el nombre del paquete al que pertenece.

En el caso concreto del servicio EstudioService definido anteriormente, podramos generar las clases necesarias de la siguiente forma:wsgen -s src -d build/classes -cp build/classes uned.java2016.apitwitter.services.soap.EstudioServiceImpl

Para comprobar que el nuestro servicio web esta desplegado, podemos acceder a su definicin WSDL a travs de la direccin:http://localhost:8080/APITwitterWeb/services/soap/ClinicalStudyWS?wsdl

Con esto se generarn una serie de clases en el servidor que implementan el servicio web. Se crean en el paquete:4.2.2 uned.java2016.apitwitter.services.soap.estudios.jaxws

5.4 Despliegue del servicio web en el Cliente

A partir de JDK 1.6 se incluye en Java SE la librera JAX-WS y las herramientas necesarias para crear e invocar servicios. Podemos encontrar las clases de la API de JAX-WS dentro del paquete javax.xml.ws.

Para crear un cliente en JDK 1.6 (o con JAX-WS en versiones anteriores de JDK) utilizaremos la herramienta: wsimport.

wsimport:

Toma como entrada el documento WSDL del servicio al que queremos acceder y producir un conjunto de clases Java que nos permitirn acceder al servicio.

Esta herramienta se puede invocar desde lnea de comando del siguiente modo:wsimport -s -d -p

directorio donde queremos que guarde los fuentes de las clases generadas directorio donde guardar estas clases compiladaspaquete en el que se generar este conjunto de clases () El WSDL se especificar mediante su ruta en el disco o mediante su URL.

Para generar los artefactos del lado del cliente a partir del servicio web previamente creado debemos ejecutar en lnea de comandos:wsimport -keep -verbose http://localhost:8080/APITwitterWeb/services/soap/ClinicalStudyWS?wsdl

Se generarn una serie de clases que nos permitirn acceder al servicio web e invocar sus operaciones desde nuestro cliente. Una de estas clases recibir el mismo nombre que el servicio y heredar de la clase Service.

5.5 Programando la Vista en Swing Cliente

Centrandonos en el controlador de Swing SwingSOAPController.java. En nuestro caso, dentro del paquete: package uned.java2016.apitwitter.services.rs.client;

Deberemos instanciar la clase generada anteriormente EstudioServiceImplService y a partir de ella obtendremos el stub para acceder a un puerto del servicio. Este stub tendr la misma interfaz que el servicio web, y a partir de l podremos invocar sus operaciones.

En nuestro ejemplo de Servicio SOAP Obtener Estudios Clnicos partiendo de un Hashtag elegido por el usuario accederamos de la siguiente forma:Detalle de SwingSOAPController.java: