WebService JSON+REST con Play

¿ Qué es un servicio web ?

Podemos verlo en esta página.

Generación de JSON

Como dijimos antes, una decisión de arquitectura define dónde vamos a poner la responsabilidad de crear y manipular la vista. En base a eso cambiará el rol del servidor y la arquitectura
  • Arquitectura Browser-Servidor (cuasi-completo): es un aplicación tradicional web, donde el server además de ejecutar la lógica de negocio ya devuelve la vista (html+css)
  • RIA (Rich-Internet Application): la vista está del lado del navegador en html a través de código javascript. El servidor recibe pedidos para ejecutar lógica de dominio y retornar información a la vista.
Para angular vamos a trabajar con este último enfoque. En Wicket veremos el otro tipo de arquitectura.

¿ Cómo se comunican entonces cliente y servidor?
El servidor no retorna HTML ni texto plano, sino un formato especial llamado JSON que es independiente de la vista (no tiene detalles estáticos, ni tampoco controles como botones, etc).
Podemos decir entonces que nuestra "V" del "MVC", no va a estar en el servidor, sino, sólamente en el lado cliente.

JSON

Conviene que lean primero esta página sobre qué es JSON.

Como generar JSON con Play

Ahora bien, así como antes generábamos HTML o texto plano, nuestro controller de Play puede generar JSON.
Después de todo es texto, con un formato especial, pero sigue siendo texto.

Para interactuar con el servicio ahora recomendamos instalarse un plugin de Chrome que nos va a hacer la vida más fácil

Vamos a agregar un método al servicio que nos permite obtener la lista de todos los libros de la Biblioteca.
Para eso agregamos la ruta.

GET  /libros  controllers.Application.libros()

Y un método en el controller:

    public static Result libros() {
     response().setContentType("application/json");
     Collection<Libro> libros = Biblioteca.getInstance().todasLasInstancias();
     return ok(Json.toJson(libros));
    }

Acá vemos varias cosas:
  • Es conveniente especificar como parte de la respuesta, que estamos retornando contenido de tipo json, a través de setear el content type en application/json.
  • Play nos da una librería o framework que sirve para: dado un objeto java, generar el JSON correspondiente. La clase es play.libs.Json
  • Vemos que incluso sabe transformar colecciones.

Hacemos el pedido desde el cliente y veremos algo así:



Listo, esa es toda la magia que necesitamos para generar JSON.
Ya tenemos nuestro primer web service REST/JSON de Libros :)

Más info sobre JSON en Play

Obtener un libro por id

Ahora podemos combinar lo que ya vimos de parámetros para que el cliente pueda pedir un libro específico.

GET  /libro/:id  controllers.Application.libro(id:Int)

Y en el controller:

    public static Result libro(int id) {
     try {
     return ok(Json.toJson(Biblioteca.getInstance().getLibro(id)));
     }
     catch (UserException e) {
     return notFound();
     }
    }

Probamos desde el browser:

http://localhost:9000/libro/1



Agregar un nuevo libro (POST con JSON body)

Por último es probable que en una aplicación el cliente permita al usuario dar de alta, es decir crear, nuevas instancias de objetos. Con lo cual el servicio deberá proveer un método, en este caso para agregar un nuevo libro.

Y cómo viaja el libro que está en el cliente al servidor ? En forma de JSON, lógicamente.

En este caso el pedido HTTP debe ser de tipo POST y como "cuerpo" o body debe viajar el libro en forma de JSON.

POST http://localhost:9000/agregarLibro

{
 "titulo" : "Príncipe y Mendigo",
 "autor"  : "Mark Twain"
}

En routes:

POST  /agregarLibro                 controllers.Application.agregarLibro()

Y el controller:

    public static Result agregarLibro() {
      Libro nuevo = Json.fromJson(request().body().asJson(), Libro.class);
     Biblioteca.getInstance().agregarLibro(nuevo.getTitulo(), nuevo.getAutor());
     return ok("OK");
    }

Comments