lunes, 15 de septiembre de 2014

Publicación con representación JSON y XML en JAX-RS

En la publicación anterior creamos y publicamos un recurso mediante el verbo GET con JAX-RS. En esta entrada continuaremos con el ejercicio mediante la publicación del recurso con el verbo POST y expondremos el recurso con el formato JSON y XML.

Separación de la implementación del recurso y su interfaz


Una de las ventajas del uso de JAX-RS es que podemos utilizar una interfaz para exponer nuestro recurso y de esta forma eliminar las anotaciones de la clase que implementa. Esto hace más legible el código de la implementación ademas de permitirnos encapsular en la interfaz los detalles de la tecnología que utilizaremos para exponer nuestro recurso; de esta forma podríamos cambiar las anotaciones de la interfaz y así exponer nuestro recurso mediante SOAP con JAX-WS.

Vamos a crear la siguiente interfaz:
@Path("pagos/{idCiente}")
public interface IPagoResource {
    @Produces("application/json")
    @GET
    String getPagoByIdCliente(@PathParam("idCliente") int idCliente);
}

Ahora crearemos la clase que implementará la interfaz y representará nuestro recurso:
public class PagoResource implements IPagoResource 
{
    public String getPagoByIdCliente(int idCliente) {        
        return "\"pagos\":[{\"cantidad\":520,\"idCliente\":23}, " +
        "{\"cantidad\":520,\"idCliente\":23}]";
    }
}


Despliegue del recurso:

Para desplegar el recurso y verificar que podamos invocar el recurso de pagos mediante el verbo GET, con contenido JSON ejecutamos los siguientes pasos:
  1. Abrir una terminal
  2. Navegar al directorio de nuestra aplicación
  3. Ejecutar el comando maven:
  4. mvn clean package
    
  5. Abrir glassFish y redesplegar el war
  6. Ejecutar el siguiente comando:
  7. curl -X GET -H "Accept:application/json" http://cmoralesflap:8080/MiServicio/pagos/2
    

    Nota. MiServicio debe ser remplazado por el contexto elegido al desplegar nuestra aplicación.

POST CON JSON


Una vez hecha la separación del recurso y su interfaz, ahora vamos a exponer al recurso para la recepción de pagos mediante el verbo POST y tipo de contenido JSON.

Primero necesitamos crear la clase Pago en el paquete mx.org.miempresa.miservicio.to
public class Pago 
{
    private int id;
    private BigDecimal cantidad;
    private int idCliente;
}
Nota. Se omiten los accessors y mutators para simplificar el código.

Vamos a crear ahora la operación en la interfaz IPagoResource para exponer nuestro recurso
@Path("pagos/{idCliente}")
public interface IPagoResource {
    @POST
    @Produces("application/json")
    @Consumes("application/json")    
    Pago savePago(Pago pago);
}

Algunos puntos a resaltar de la operación expuesta son los siguientes:
  • JAX-RS por default da soporte para exponer tipo de recursos JSON mediante la librería Jackson.
  • La anotación @POST Indica que este recurso será invocado utilizando el verbo POST.
  • @Produces("application/json") Indica que el recurso produce como salida tipo de contenido JSON, mismo que el cliente deberá procesar.
  • @Consumes("application/json") Indica que el cliente deberá consumir el recurso mediante el envío de contenido JSON, el cual representa el pago realizado por un cliente.

Vamos a implementar la funcionalidad de nuestro recurso expuesto:
public class PagoResource implements IPagoResource {
    public Pago savePago(Pago pago) 
 {
        pago.setId(23);
        return pago;
    }
}

Como podemos observar la operación retorna la entrada que ha recibido, agregando el identificador del pago generado.

Para desplegar el recurso y verificar que podamos invocar el recurso de pagos mediante el verbo POST, con contenido JSON ejecutamos los pasos antes definidos en la sección de Despliegue del recurso e intercambiamos el comando del paso 5 por el siguiente:

curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" -d '{\"cantidad\":520,\"idCliente\":23}' http://host:puerto/MiServicio/pagos/2
Comando POST con curl

POST CON XML

JAXB. Permite a los desarrolladores mapear clases Java a representaciones XML. JAXB provee dos características principales: Permite serializar y deserializar clases java a XML y viceversa; además de permitir la generación de un esquema para la validación de la representación.

Para poder exponer nuestro recurso con representación XML seguimos los siguientes pasos:

  1. Agregar la siguiente dependencia al POM del proyecto:
  2. <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.6</version>
    </dependency> 
    
  3. Modificar el recurso para producir JSON y XML
  4.     @POST
        @Produces({"application/json", "application/xml"})
        @Consumes("application/json")    
        Pago savePago(Pago pago);
    
  5. Agregar la anotación @XmlRootElement a la entidad de Pago. Esta anotación indica cual será el root del xml a generar. En este caso pago puesto que no le definimos un nombre en los atributos de la anotación.
  6. Redesplegar el recurso
  7. Modificar el comando curl para que acepte respuesta en formato XML
  8. curl -X POST -H "Accept: application/xml" -H "Content-Type: application/json" -d '{\"cantidad\":520,\"idCliente\":23}' http://host:puerto/MiServicio/pagos/2
    

La siguiente imagen muestra el comando curl con el verbo POST para negociar la representación del recurso de pago.

Comando curl con verbo POST y negociación de representación

Como podemos ver desplegar el recurso con formato JSON y XML ha sido relativamente sencillo y flexible para la negociación del formato requerido por el cliente. En la siguiente entrada veremos como publicar nuestro recurso con los verbos POST y DELETE.

No hay comentarios:

Publicar un comentario