practica 8. implementacion de una api rest - presentacion

Upload: vicente-aguilar

Post on 06-Jan-2016

29 views

Category:

Documents


0 download

DESCRIPTION

API REST Web Service

TRANSCRIPT

  • 21/04/2013

    1

    Arquitectura e Integracin del Software

    Departamento de Lenguajes y Sistemas Informticos

    Implementacin de una API REST

    Prctica 8

    Curso 2012/2013

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

  • 21/04/2013

    2

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

    Introduccin

    En prcticas anteriores hemos estudiado como consumirservicios REST para integrarlos en nuestras aplicaciones.

    Sin embargo, es igualmente importante hacer que nuestrasaplicaciones puedan ser integradas por otros.

    El objetivo de la prctica de hoy es aprender a implementaruna API REST en Java haciendo uso del framework RESTEasy,que implementa la interfaz JAX-RS.

  • 21/04/2013

    3

    Introduccin

    JAX-RS (JSR-311) es una especificacin Java diseada parafacilitar la implementacin de APIs REST.

    Est basada fundamentalmente en el uso de anotaciones (ej.@GET).

    Los desarrolladores decoran las clases Java con lasanotaciones JAX-RS para definir los recursos y las acciones quepueden ser realizadas sobre stas.

    En esta prctica usaremos la implementacin de JAX-RSproporcionada por RESTEasy.

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

  • 21/04/2013

    4

    Configuracin del servidorPasos a seguir

    1. Copiar los JAR a war/WEB-INF/lib

    2. Aadir resteasy-jaxrs y jaxrs-api al Build Path(son los nicos que usaremos directamente en el cdigo).

    3. Configurar el web.xml

    4. Implementar la clase javax.ws.rs.core.Application

    Configuracin del servidorConfiguracin del Web.xml

  • 21/04/2013

    5

    import javax.ws.rs.core.Application;

    public class MusicApplication extends Application {

    private Set singletons = new HashSet();

    private Set>();

    // Loads all resources that are implemented in the application so that they can be found by

    RESTEasy.

    public MusicApplication() {

    singletons.add(new PlaylistsResource());

    }

    public Set

  • 21/04/2013

    6

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

    EjemplosGET (Consulta)

  • 21/04/2013

    7

    EjemplosPOST (Insercin)

    EjemplosPUT (Actualizacin)

  • 21/04/2013

    8

    Los mtodos GET son fciles de probar desde el navegador.Para probar los mtodos POST, DELETE y PUT hay variasopciones:

    Usar el cliente REST desarrollado en prcticas anteriores.

    Instalar una extensin del navegador que permita hacer laspruebas:

    En Chrome: Advanced REST Client o REST Console

    En Firefox: REST Client

    EjemplosCmo puedo probar esto?

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

  • 21/04/2013

    9

    Anotaciones

    @Path indica la URI relativa donde se alojar la clase Java.Puede aplicarse tanto a clases como a mtodos.

    Se pueden definir template URIs haciendo uso de {} (ej.@Path(/{id})).

    @GET, @POST, @PUT, @DELETE indican el verbo HTTP queprocesar el mtodo.

    @Produces y @Consumes indican el formato en el queproduce o consume mensajes. Por ejemplo, text/plain oapplication/json.

    Anotaciones

    @PathParam sirve para inyectar como parmetro del mtodolos valores de la URI template.

    Otras anotaciones: @Context.

    @QueryParam.

    @CookieParam.

    @Form, etc.

    Para ms informacin ver secciones 4 7, 9 15 de http://docs.jboss.org/resteasy/docs/2.3.1.GA/userguide/html/index.html

  • 21/04/2013

    10

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

    Respuestas

    HTTP tiene un conjunto de respuestas a las peticiones identificadas con un nmero y una descripcin:

    200 OK

    201 Created

    204 No Content

    400 Bad request

    404 Not found

    409 Conflict

    500 Internal Error

    Etc.

  • 21/04/2013

    11

    Si el mtodo devuelve un valor, el resultado es 200 OK.

    Si el mtodo es void, el resultado es 204 No Content.

    Si hay un error al procesar los parmetros de entrada (p.ej. elJSON de entrada es errneo) el resultado es 400 Bad Request.

    Otros errores pueden provocar un 500 Internal Error.

    RespuestasRespuestas por defecto en RESTEasy

    La forma ms sencilla es lanzando excepciones:

    Las excepciones predefinidas pueden consultarse en:http://docs.jboss.org/resteasy/docs/2.3.1.GA/userguide/html/ExceptionHandling.html#builtinException

    @Path("/{listId}")

    @GET

    @Produces("application/json")

    public Playlist getPlaylist(@PathParam("listId") String name ) {

    if (playlists.get(name) == null)

    throw new NotFoundException("The playlist "+name+" was not found");

    return playlists.get(name);}

    RespuestasCmo implemento otras respuestas?

  • 21/04/2013

    12

    Algunas respuestas no tienen excepcin predefinida. En ese caso,hay que modificar el mtodo para que devuelva Response yconstruir la respuesta:

    RespuestasCmo implemento otras respuestas?

    Por ltimo, la respuesta de 201 Created a un mtodo POST esms compleja que el resto porque debe:

    Indicar cul es la URI del recurso que se ha creado.

    Incluir el elemento creado en la respuesta.

    RespuestasCmo implemento otras respuestas?

  • 21/04/2013

    13

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

    Buenas prcticas

    Hay muchas formas de estructurar el cdigo de la aplicacin,pero siempre es recomendable buscar una que consiga:

    Alta cohesin: las clases, mtodos, etc. deben tener pocasresponsabilidades (es decir, no hacer demasiadas cosas).

    Bajo acoplamiento: las clases deben depender lo mnimoposible unas de otras.

    Consiguiendo esto lograremos que nuestro cdigo sea msfcil de entender y mantener.

  • 21/04/2013

    14

    Buenas prcticas

    Para conseguir una alta cohesin y bajo acoplamiento serecomienda dividir el cdigo en tres tipos de clases agrupadosen paquetes:

    Domain: clases relativas a los conceptos del dominio delproblema (ej. Playlist y Song).

    Repositories: clases que representan el concepto derepositorio o coleccin de objetos de un mismo tipo (ej.PlaylistRepository)

    Resources: clases que representan recursos y tiene lasanotaciones JAX-RS (ej. PlaylistResource y SongResource).

    Buenas prcticas

    Cada repositorio suele estructurarse en interfaz y una o variasclases que lo implementan. Un ejemplo bsico de interfaz derepositorio puede ser:

    La interfaz puede tener varias implementaciones. Por ejemplo:

    Implementacin que guarda las playlists en un Map en memoria.

    Implementacin guarda las playlists en una base de datos.

    public interface PlaylistRepository {

    public Playlist get(String name);

    public void save(Playlist p);

    public Collection getAllPlaylists();

    public void remove(Playlist p);

    }

  • 21/04/2013

    15

    Introduccin

    Configuracin del servidor

    Ejemplos

    Anotaciones

    Respuestas

    Buenas prcticas

    Enlaces

    ndice

    Enlaces

    RESTEasy

    http://www.jboss.org/resteasy/

    JAX-RS

    http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html

  • 21/04/2013

    16

    All material displayed on this presentation is for teaching and personal use only.

    Many of the images that have been used in the presentation are Royalty Freeimages taken from http://www.everystockphoto.com/. Other images have beensourced directly from the Public domain, from where in most cases it is unclearwhether copyright has been explicitly claimed. Our intention is not to infringeany artists copyright, whether written or visual. We do not claim ownership ofany image that has been freely obtained from the public domain. In the eventthat we have freely obtained an image or quotation that has been placed in thepublic domain and in doing so have inadvertently used a copyrighted imagewithout the copyright holders express permission we ask that the copyrightholder writes to us directly, upon which we will contact the copyright holder torequest full written permission to use the quote or images.

    Disclaimer and Terms of Use