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.

Excelente pero tengo una pregunta que pasa cuando el servicio está protegido por un protocolo como OAuth2, estoy utilizando jersey para obtener el token y poder enviarlo en cada petición rest, pero no lo consigo, tendrás documentación al respecto.
ResponderEliminarExcelente pero tengo una pregunta que pasa cuando el servicio está protegido por un protocolo como OAuth2, estoy utilizando jersey para obtener el token y poder enviarlo en cada petición rest, pero no lo consigo, tendrás documentación al respecto.
ResponderEliminarHola Luis. Cuando he requerido utilizar algun mecanismo de seguridad para consumir recursos REST, normalmente construyo el request manualmente. por ejemplo para enviar un mensaje GCM to Google Cloud Messaging utilizando el key generado para el server en Google Console Developers, utilizo un bloque de código como el siguiente:
EliminarClient client = ClientBuilder.newClient();
Payload payload = createPayload(idDevice);
client.target("https://gcm-http.googleapis.com/gcm/send").request(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/json")
.header("Authorization", "key=myKey")
.post(Entity.entity(payload, MediaType.APPLICATION_JSON), Payload.class);
Primero pruebo con una herramienta como curl, y luego ya solo construyo el request.
https://developers.google.com/cloud-messaging/http
Desafortunadamente no he tenido la oportunidad de explorar con gran detalle la implementación de ese protocolo, pero sé que Jersey solo soporta Oauth2 en el lado del cliente. Entonces la unica documentación podría ser de la página oficial.
https://jersey.java.net/apidocs/2.9/jersey/org/glassfish/jersey/client/oauth2/OAuth2ClientSupport.html
Muy buen post. Tengo una duda sabe usted como leer los link de un servicio RESTFull que hace uso de HATEOAS?
ResponderEliminar