Jersey provee un API para extender las herramientas proporcionadas por JAX-RS con características extras y utilidades para facilitar la creación y consumo de servicios REST.
En esta ocasión veremos el consumo de recursos REST por medio de Jersey. Jersey contiene una librería para el cliente que puede ser utilizada para probar o construir un cliente real en java. La clase Client es el punto de configuración principal para construir un cliente de servicios REST.Vamos a consumir el recurso pagos/{idCliente} creado en la entrada anterior con la librería de Jersey:
Agregando la dependencia del cliente
Para poder utilizar Jersey en nuestro cliente, vamos a incorporar la siguiente dependencia:<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.11</version> <scope>provided</scope> </dependency>
Creando la instancia de Client
import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; Client client = ClientBuilder.newClient();
Ubicando el recurso
Una vez que tenemos la instancia de la clase Client crearemos un WebTarget que representa el contexto root de la aplicación REST.
WebTarget rootTarget = client.resource("http://cmoralesflap:8080/MiServicio/");
Ahora que ya tenemos el WebTarget apuntando al contexto root, crearemos otro WebTarget para el recurso que deseamos consumir. Como se puede observar la instancia de WebTarget puede ser utilizada para derivar otros WebTargets.
WebTarget pagosTarget = rootTarget.path("pagos").path("{idCliente}") .resolveTemplate("idCliente", idCliente);
Puesto que nuestro recurso utiliza Path Parameters en la solicitud del cliente debemos especificarla por medio de parámetros de template. Los parámetros de template son especificador envolviendo los parámetros por medio de llaves. Una vez especificados debemos llamar al método resolveTemplate para sustituir el {idCliente}, con el valor real.
Consumiendo el recurso
Ya hemos ubicado el recurso, ahora solo queda que hagamos el consumoInvocation.Builder builder = pagosTarget.request(MediaType.TEXT_PLAIN); builder.accept(MediaType.APPLICATION_JSON); Response respuesta = builder.get();Como vemos el consumo del recurso es muy descriptivo:
- Enviamos la información en texto plano. MediaType.TEXT_PLAIN "text/plain"
- Recibimos la información en formato JSON. MediaType.APPLICATION_JSON "application/json"
public static void main(String[] args) { int idCliente = 23; Client client = ClientBuilder.newClient(); WebTarget rootTarget = client .target("http://cmoralesflap:8080/MiServicio/"); WebTarget pagosTarget = rootTarget.path("pagos").path("{idCliente}") .resolveTemplate("idCliente", idCliente); Invocation.Builder builder = pagosTarget.request(MediaType.TEXT_PLAIN); builder.accept(MediaType.APPLICATION_JSON); Response respuesta = builder.get(); System.out.println("Estatus " + respuesta.getStatus()); System.out.println("Respuesta " + respuesta.readEntity(String.class)); client.close(); }
No olvidemos invocar el método cerrar en el cliente. Las instancias de Client son objetos muy pesados. Por razones de rendimiento, debemos limitar el número de instancias en la aplicación, debido a que la inicialización y destrucción de estas es muy costoso en el ambiente de ejecución.
