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, creemos que es necesario abordar el punto principal de optimización del rendimiento. ¿Adivina qué? Como el texto responde, se puede comprimir. Y con las capacidades actuales de los teléfonos móviles y tabletas, descomprimir texto en el lado del cliente no debería ser un gran problema... Entonces, en este artículo, si lo construyes usando Java's Jersey, explicaré cómo puedes comprimirlo selectivamente. Respuesta de API REST, este Jersey es una implementación de mapeo JAX-RS (y más)...
1.Filtros e interceptores de Jersey
Gracias a Jersey por su potente filtrado La implementación de esto Es bastante fácil gracias a las funciones de controlador e interceptor. 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 déjate echar un vistazo a tu propio 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 {
MultivaluedMap
headers.add("Content-Encoding", "gzip");
final OutputStream outputStream = context.getOutputStream();
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
.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 se analizará con más detalle en los siguientes párrafos
"El interceptor obtiene un flujo de salida de WriterInterceptorContext y establece un nuevo The flujo de salida empaquetado con el contenedor GZIP original Después de ejecutar todos los interceptores, el flujo de salida finalmente establece el WriterInterceptorContext que se utilizará para serializar la entidad. En el ejemplo anterior, los bytes de la entidad se escribirán en GZIPoutputStream. datos y escribirlos en el flujo de salida sin procesar. El flujo de salida sin procesar siempre escribirá los datos en el cable. Cuando se utiliza el interceptor en el servidor, el flujo de salida sin procesar escribirá los datos en el flujo del contenedor del servidor subyacente. enviar 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 otros atributos. Al comprimir su propia respuesta, debe configurar el bit de encabezado 'Codificación de contenido' gzip"
1.2 Notas de compresión;
Los filtros e interceptores se pueden vincular por nombre. La vinculación de nombres es un concepto que permite indicarle a un tiempo de ejecución JAX-RS que un filtro específico es solo para un método de recurso específico. Cuándo se ejecutará. un filtro o interceptor está restringido a algunos métodos de recursos específicos, se considera un enlace de nombre. Los filtros e interceptores sin tales restricciones se denominan globales. La anotación @Compress se ha creado en el ejemplo:
Compress. anotación
paquete org.codingpedia.demo.rest.interceptors;
importar java.lang.annotation.
importar java.lang.annotation.RetentionPolicy ;
import javax.ws.rs.NameBinding;
//@La anotación Compress es la anotación de enlace de nombre
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Comprimir {}
Y usarlo para marcar el El método en el recurso, este método debe comprimirse (por ejemplo: cuando GET- ing, todos los blogs usan PodcastsResource)
El uso de la anotación @Compress en el método de recursos
@Component
@Path("/podcasts") p>
PodcastsResource de clase pública {
@Autowired
PodcastService privado podcastService;