Hace poco indicamos como hacer un prototipo de Servicio Web con JAX-WS (En dos post: primero y segundo). Ahora vamos a realizar un prototipo de Servicio Web pero utilizando JAX-RS. Para empezar explicaremos que es JAX-RS y REST:
- REST: Interfaz entre sistemas que utiliza directamente HTTP para obtener datos o indicar la ejecución de operaciones sobre los datos, en cualquier formato (XML, JSON, etc) sin las abstracciones adicionales de los protocolos basados en patrones de intercambio de mensajes, como SOAP.
- JAX-RS: API que proporciona soporte en la creación de servicios web de acuerdo con REST. Desde su versión 1.1 ya se encuentra incluido en JEE.
Para empezar crearemos una aplicación web mavenizada básica y a partir de ella construiremos nuestro servicio. Una vez creada le indicamos las dependencias que va a tener:
- jersey-servlet: Para importar todas las librerías necesarias para el uso de REST. Jersey es la implementación de Sun/Oracle del estándar.
- jersey-json: Para incluir las librerías necesarias para el manejo de JSON, que será como transmitamos la información.
- hibernate-entitymanager: Para el manejo de información contra la BBDD.
Para evitar hacerlo muy extenso, explicaremos brevemente la capa del modelo y BBDD puesto que es exactamente igual que en los post de JAX-WS. El modelo constará de dos clases 'User' con idéntica información:
- Una clase con anotaciones JPA que contendrá la representación de la tabla y con la cual podremos hacer las operaciones contra la BBDD.
- Una con anotaciones 'javax.xml.bind' que nos permitirá enviar la información a través del servicio con un determinado formato.
La configuración de BBDD la haremos de la siguiente forma:
- Un fichero 'persistence.xml' donde configuraremos la conexión a BBDD.
- Una clase genérica 'AbstractDao' que nos permitirá crear la configuración y el 'entityManger' para realizar las operaciones.
- Una clase especifica 'UserDaoImpl' que implemente 'AbstractDao' y que nos permita realizar las operaciones contra la tabla 'User'.
Ahora vamos a lo interesante, como crear el servicio una vez que tenemos la estructura. Para empezar crearemos el servicio en sí:
@Path("/webserviceSample") @Produces(MediaType.APPLICATION_JSON) public class WebServiceSampleImpl implements WebServiceSample {
- La anotación @Path nos indica en que dirección de la aplicación va a estar disponible el servicio web.
- La anotación @Produces indica que va producir el servicio web, en nuestro caso JSON.
Ahora vamos a crear un método dentro del servicio web:
@GET @Path("/users") public List getPersonas() { UserDao dao = new UserDaoImpl(); List list = dao.getUsers(); List result = new ArrayList(); for (User p : list) { result.add(UserXml.valueOf(p)); } return result; }
- La anotación @Path indica la dirección de la aplicación desde la cual va a ser accesible dicho método. Esta dirección debe de ser concatenada a la dirección de la aplicación, por tanto quedaría '/webserviceSample/users'.
- La anotación @GET indica que método HTTP será el utilizado para acceder a ese método en la ruta indica.
El método HTTP con el cual acceder a una URL de servicio JAX-RS es algo muy importante, hay cuatro posibles: POST, GET, PUT y DELETE. Normalmente se les asocia con una función específica. Esto nos permita que si atacamos a una misma dirección de un servicio web REST, realizará una función u otra en base al método que hayamos utilizado. Este es el uso común: POST para insertar información, GET para solicitarla, PUT para actualizarla y DELETE para borrarla. Si implementase los 4 servicios pasaría a denominarse un servicio CRUD (CREATE, READ, UPDATE y DELETE).
Por último solo nos queda la configuración del servicio a nivel de aplicación, a través del web.xml. En el tendremos que crear la configuración para que un servlet de la librería Jersey filtre todas las llamadas que queramos sean atendidas por el servicio web. En nuestro caso hemos puesto la url '/rest' por lo que ahora si queremos llamar a nuestro servicio necesitaremos acceder a la siguiente dirección: http://localhost:8080/ExampleJaxRS/rest/webserviceSample/users/.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>ExampleJaxRS</display-name> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>es.home.ws.example.service</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
En este enlace (ExampleJaxRS) podréis encontrar el código fuente subido a Github.
No hay comentarios:
Publicar un comentario