Red de conocimiento informático - Material del sitio web - Cómo comprimir respuestas usando GZip y Jersey en la API REST de Java

Cómo comprimir respuestas usando GZip y Jersey en la API REST de Java

Hay muchos escenarios en los que la respuesta proporcionada por su API REST es muy larga, y todos sabemos lo importantes que son la velocidad de entrega y los préstamos en dispositivos/redes móviles. Al desarrollar aplicaciones móviles que admitan API REST, creo que es necesario abordar los puntos principales de optimización del rendimiento. ¿Adivina qué? Como el texto responde, podemos comprimirlo. Y con las capacidades actuales solo de teléfonos y tabletas, descomprimir texto en el lado del cliente no debería ser un gran problema... Entonces, en esta publicación, cubriré cómo puedes tener la opción si lo compilas usando Jersey To de Java. comprime las respuestas de la API REST, esta implementación de mapeo JAX-RS de Jersey (y más)...

1. Filtros e interceptores de Jersey

Ah, gracias. Con las potentes funciones de filtro e interceptor de Jersey, Esta implementación es bastante fácil. Luego, los filtros están destinados principalmente a mantener parámetros de solicitud y respuesta como encabezados HTTP, URI y/o métodos HTTP, y los interceptores están destinados a mantener entidades, manteniendo los flujos de entrada/salida de las entidades.

Pero para la compresión se usará un GZip WriterInterceptor, en este caso se usa un interceptor de escritura, en esa clase la entidad se escribe en "wire", cuando en este caso es del lado del servidor, esto significa generar una entidad de respuesta.

1.1GZip Writer Interceptor

Entonces echemos un vistazo a nuestro GZip Writer Interceptor:

GZip Writer Interceptor

paquete org. codingpedia.demo.rest.interceptors;

importar java.io.IOException;

importar java.io.OutputStream;

importar java.util.zip. GZIPoutputStream;

importar javax.ws.rs.WebApplicationException;

importar javax.ws.rs.core.MultivaluedMap;

importar javax.ws.rs. ext.WriterInterceptor;

importar javax.ws.rs.ext.WriterInterceptorContext;

@Provider

@Compress

clase pública GZIPWriterInterceptor implementa WriterInterceptor {

@Override

public void aroundWriteTo(WriterInterceptorContext context)

lanza IOException, WebApplicationException {

MultivaluedMaplt, Objectgt; ; encabezados = context.getHeaders();

headers.add("Content-Encoding", "gzip");

final OutputStream outputStream = context.getOutputStream();< / p>

context.setOutputStream(new GZIPoutputStream(outputStream));

context.proceed();

}

}

Nota:

Implementa WriterInterceptor, que es una interfaz para escribir el cuerpo del mensaje de un interceptor. Esta interfaz envuelve la llamada a javax.ws.rs.ext.MessageBodyWriter.writeTo

<. p > Los proveedores que implementan el protocolo WriterInterceptor deben registrarse mediante programación con un tiempo de ejecución JAX-RS o deben anotarse con la anotación @Provider para que el tiempo de ejecución JAX-RS los descubra automáticamente durante una declaración de escaneo del proveedor.

@Compress es el nombre de la anotación vinculante, que analizaremos con más detalle en los siguientes párrafos

"El interceptor obtiene un flujo de salida de WriterInterceptorContext y establece un nuevo The El flujo de salida envuelto en el contenedor GZIP original se utilizará para serializar la entidad después de que se hayan ejecutado todos los interceptores.

En el ejemplo anterior, los bytes de la entidad se escribirán en GZIPOutputStream. Esta clase comprimirá los datos del flujo y luego los escribirá en el flujo de salida original. Las transmisiones sin procesar siempre escriben datos en el cable. Cuando se utiliza el interceptor en el servidor, el flujo de salida sin procesar escribe los datos en el flujo del contenedor del servidor subyacente y luego envía la respuesta al cliente. "

"El método sobrecargado aroundWriteTo() obtiene WriterInterceptorContextz como parámetro. Este contexto incluye captadores y configuradores de parámetros de encabezado de solicitud, atributos de solicitud, entidades, flujos de entidades y otras propiedades cuando comprime su respuesta, debe configurar el bit de encabezado 'Codificación de contenido' gzip"

1.2 Anotaciones de compresión;

Los filtros e interceptores se pueden vincular por nombre. El enlace de nombre es un concepto que permite indicarle a un tiempo de ejecución JAX-RS que un método específico es solo para un recurso específico. El filtro o interceptor está restringido a algunos métodos de recursos específicos, lo consideramos un enlace de nombre. Los filtros e interceptores sin tales restricciones se denominan globales.

En nuestro ejemplo, hemos creado la anotación @Compress:

Comprimir anotación

paquete org.codingpedia.demo.rest.interceptors;

importar java. annotation.Retention;

importar java.lang.annotation.RetentionPolicy;

importar javax.ws.rs.NameBinding;

//@Comprimir la anotación es la anotación de enlace de nombre

@NameBinding

@Retention(RetentionPolicy.RUNTIME)

public @interface Comprimir {}

Y usarlo es se usa para marcar el método en el recurso, que debe comprimirse (p. ej.: cuando se realiza GET, todos los blogs usan PodcastsResource)

El uso de la anotación @Compress en métodos de recursos

p>

@Component

@Path("/podcasts")

PodcastsResource de clase pública {

@Autowired

PodcastService privado podcastService;

.........................

/*

* *** ********************************** LEER ************ *** *********************

*/

/**

* Devoluciones todos los recursos (podcasts) de la base de datos

*

* @return

* @throws IOException

* @throws JsonMappingException

* @throws JsonGenerationException

* @throws AppException

*/

@GET

@Compress

@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

public Listlt;Podcastgt; getPodcasts(

@QueryParam("orderByInsertionDate") String orderByInsertionDate,

@QueryParam("numberDaysToLookBack") Número enteroDaysToLookBack)

lanza IOException, AppException {

Listlt;Podcastgt; podcastService.

getPodcasts(

orderByInsertionDate, numberDaysToLookBack);

devolver podcasts;

}

..... ...... ..........

}

2. Prueba

2.1SOAPui

Bueno, si estás probando con SOAPui, puede violar PodcastsResource usando la siguiente solicitud

Solicitud:

Solicitud de ejemplo:

GET http://localhost :8888/demo-rest- jersey-spring/podcasts/?orderByInsertionDate=DESC HTTP/1.1

Aceptar-codificación: gzip, deflate

Aceptar: aplicación/json, aplicación/xml

Host: localhost: 8888

Conexión: Keep-Alive

Agente de usuario: Apache-HttpClient/4.1.1 (java 1.5)

Respuesta:

Respuesta json comprimida, descomprimida automáticamente a través de SOAPui

HTTP/1.1 200 OK

Tipo de contenido: aplicación/json

Codificación de contenido: gzip

Longitud del contenido: 409

Servidor: Jetty(9.0.7.v20131107)

[

{

"id": 2,

"title": "Quarks & Co - zum Mitnehmen",

"linkOnPodcastpedia ": "http://www.podcastpedia.org /quarks",

"feed": "http://podcast.wdr.de/quarks.xml",

"description": "Quarks & Co: Das Wissenschaftsmagazin" ,

"insertionDate": "2014-10-29T10:46:13.00 0100"

},

{

"id ": 1,

"title": "- El podcast de los científicos desnudos - Desmontando la ciencia",

"linkOnPodcastpedia" : "http://www.podcastpedia.org/podcasts /792/-The-Naked-Scientists-Podcast-Stripping-Down-Science",

"feed": "feed_placeholder",

"description": "El buque insignia de Naked Scientists El programa de ciencia te trae una luz.

Mirada completa de los últimos avances científicos, entrevistas con los mejores científicos del mundo, respuestas a tus preguntas científicas y experimentos científicos para probar en casa.",

"insertionDate": "2014-10-29T10: 46: 02.00 0100"

}

]

SOAPui acepta el tipo de contenido: encabezado gzip, lo agregamos en GZIPWriterIntercepter y descomprimimos automáticamente la respuesta y usamos ojos humanos. de forma legible

Eso es todo. Has aprendido cómo Jersey comprime las respuestas de la API REST

.