comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[JEE] Servicios REST - primer contacto

  • 0 Respuestas
  • 992 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Gus Garsaky

  • *
  • Underc0der
  • Mensajes: 93
  • Actividad:
    0%
  • Reputación -1
    • Ver Perfil
  • Skype: gus.garsaky
« en: Abril 25, 2015, 11:20:18 am »
Un servicio web nos provee mucha utilidad y flexibilidad. Al estar basado en la arquitectura Cliente Servidor, nos permite mucha escalabilidad horizontal. Para empezar, crearemos una POJO:

Código: Java
  1. public class Song implements You are not allowed to view links. Register or Login {
  2.         private You are not allowed to view links. Register or Login id;
  3.         private You are not allowed to view links. Register or Login name;
  4.         private You are not allowed to view links. Register or Login duration;
  5.  
  6.         public Song() {
  7.  
  8.         }
  9.         public Song(You are not allowed to view links. Register or Login id, You are not allowed to view links. Register or Login name, You are not allowed to view links. Register or Login duration) {
  10.                 this.id = id;
  11.                 this.name = name;
  12.                 this.duration = duration;
  13.         }
  14.         // getters y setters
  15. }

Ésta clase es un Java Bean, no un POJO. Un POJO debe cumplir los siguientes requisitos:

  • Variables privadas
  • Un constructor vacío
  • Getters y setters
  • No implementar nada del exterior


Un POJO no debe implementar ni heredar nada. Por otro lado, un JavaBean, tiene como requisito implementar la interface Serializable. La interface Serializable hace que el objeto sea descompuesto/recompuesto en una secuencia de Bytes, permitiendo así que éste objeto pueda ser transportado en diferentes ámbitos como pueden ser: ficheros, sockets, peticiones HTTP, etc.

Un JavaBean debe de implementar Serializable porque éste va a ser transportado o persistido, por lo que, si no implementara la interface Serializable, no podría ser posible su transporte.

Ahora, hagamos una clase que sirva como servicio o comúnmente llamado DAO:

Código: Java
  1. public class SongService {
  2.         private static final Map<You are not allowed to view links. Register or Login, Song> songs;
  3.         static {
  4.                 songs = new HashMap<>();
  5.                 songs.put(1, new Song(1, "Enter Sandman", 3500L));
  6.                 songs.put(2, new Song(2, "The day that never comes", 5000L));
  7.                 songs.put(3, new Song(3, "Whiskey in the jar", 4000L));
  8.         }
  9.         public static Song find(You are not allowed to view links. Register or Login id) {
  10.                 return songs.get(id);
  11.         }
  12.         // otros metodos que simulan el crud (create, findAll, update, remove)
  13. }

Ésta clase simula un servicio o DAO. Dispone de un método find, que recibe un entero que representa a un ID. Éste ID es buscado es el Map y es retornado hacia el contexto en que se llamó.

Ahora, resta crear nuestro REST:

Código: Java
  1. @Path("/music")
  2. @Stateless
  3. public class MusicServiceREST {
  4.         @Path("/find/{id}")
  5.         @Produces(MediaType.APPLICATION_JSON)
  6.         public Song findMetallica(@PathParam("id") You are not allowed to view links. Register or Login id) {
  7.                 return SongService.find(id);
  8.         }
  9.         // otros servicios (findAll, update, remove, etc)
  10. }

Aquí es necesario explicar algunas cosillas:

  • @Path indica una ruta y ésta ruta será mapeada; es decir, todas las peticiones que se hagan a dicha ruta las interceptará el REST.
  • @Stateless indica que dicha clase es un EJB (Enterprise Java Bean). Un Enterprise Java Bean es una especificación de Java EE, el cual trae una serie de novedades como: JMS, control de concurrencia, transacciones (flujos), servicios de nombre y directorios. Éste concepto lo dejaremos para después. Al estar la clase anotada con @Stateless estamos diciendo que esa clase es un EJB y que soporta las características antes mencionadas. Por ejemplo, al soportar transacciones, aquí se puede inyectar un EntityManager y que el EJB sea el encargado de manejar las transacciones (cuando se abren y cierran). En éste caso, al no haber entidades no es necesario.
  • @Produces indica qué MIME retornará la petición a dicha ruta (@Path). Aquí podemos especificar que se devolverá el MIME que se crea necesario: text/plain, text/html, application/json, application/xml, etc. En nuestro caso hemos dicho que se devolverá un objeto JSON, que es la representación de nuestro objeto Song.
  • @PathParam indica el parámetro que se va a formatear en el tipo de dato deseado. En nuestro caso, el parámetro enviado lo especificamos entre llaves, y se llamará id ({id}), así que, formateamos éste parámetro a entero para poder buscar al objeto Song con dicho ID.

Es necesario registrar nuestro REST. Para ello, solo basta hacer:

Código: Java
  1. @ApplicationPath("api")
  2. public class RestApplication extends Application {
  3.     @Override
  4.     public Set<Class<?>> getClasses() {
  5.         Set<Class<?>> rests = new HashSet<>();
  6.         rests.add(MusicServiceREST.class);
  7.         return rests;
  8.     }
  9. }

Solo debemos de agregar el class de los REST que tengamos creados para registrarlos. Una vez hecho lo anterior, ya tenemos todo hecho. Ahora, para probarlo, solo tipea la url:

Código: HTML5
  1. http://localhost:8080/tu_proyecto/api/music/find/3

La URL anterior, buscará la canción con el ID 3 y lo retornará como JSON:

Código: Javascript
  1. {
  2.     "id": 3,
  3.     "name": "Whiskey in the jar",
  4.     "duration": 4000L
  5. }

En caso se quiera consumir algo, por ejemplo, un XML, debemos de utilizar la anotación @Consumes:

Código: Java
  1. @Path("/upload")
  2. @Consumes(MediaType.APPLICATION_XML)
  3. @Produces(MediaType.TEXT_HTML)
  4. public You are not allowed to view links. Register or Login upload(final You are not allowed to view links. Register or Login IS) {
  5.     /* proceso */
  6. }

El caso anterior es sin utilizar JAXB. Si utilizáramos JAXB no necesitaríamos el InputStream. Como la petición puede venir desde todo tipo de clientes, es necesario capturarla con un InputStream para poder procesarla.

Ésta es la forma básica en que se crea un servicio REST en Java. Generalmente, se usa un REST como capa intermedia entre el acceso a datos y el cliente.


Librerías necesarias:

  • jersey-server
  • jersey-json

 

¿Te gustó el post? COMPARTILO!



[VIDEOTUTORIAL][UDEMY] Aprende a crear tu primer sitio web con Laravel 5.4

Iniciado por graphixx

Respuestas: 0
Vistas: 359
Último mensaje Febrero 24, 2018, 01:36:53 pm
por graphixx
Hagan su primer script en PHP

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1224
Último mensaje Febrero 24, 2010, 11:30:17 am
por ANTRAX