网站关键词部署,上海高端网站开发公,西安开发网站建设,如何做微网站平台api 数据gzip压缩在某些情况下#xff0c;您的REST api会提供非常长的响应#xff0c;我们都知道移动设备/网络上的传输速度和带宽仍然非常重要。 我认为这是开发支持移动应用程序的REST api时需要解决的第一个性能优化点。 你猜怎么了#xff1f; 因为响应是文本#xff0… api 数据gzip压缩 在某些情况下您的REST api会提供非常长的响应我们都知道移动设备/网络上的传输速度和带宽仍然非常重要。 我认为这是开发支持移动应用程序的REST api时需要解决的第一个性能优化点。 你猜怎么了 因为响应是文本所以我们可以压缩它们。 借助当今智能手机和平板电脑的强大功能在客户端上解压缩它们并不是什么大不了的事。因此在本文中我将介绍如何使用泽西岛Jersey在Java中构建压缩REST API响应的方法。是JAX-RS参考实现以及更多… 1.球衣过滤器和拦截器 好吧得益于Jersey强大的过滤器和拦截器功能实现起来相当容易。 过滤器主要用于操纵请求和响应参数例如HTTP头URI和/或HTTP方法而拦截器则用于通过操纵实体输入/输出流来操纵实体。 您已经在我的帖子中看到了过滤器的功能 如何使用Jersey来在Java的服务器端添加CORS支持 在此我展示了如何CORS启用REST API 和 如何使用SLF4J和Logback登录Spring 在那里我展示了如何记录来自REST API的请求和响应 但要进行压缩将使用GZip WriterInterceptor 。 Writer拦截器用于将实体写入“线路”的情况在这种情况下在服务器端这意味着写出响应实体时。 GZip作家拦截器 因此让我们看一下我们的GZip Writer拦截器 GZip作家拦截器 package org.codingpedia.demo.rest.interceptors;import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;Provider
Compress
public class GZIPWriterInterceptor implements WriterInterceptor {Overridepublic void aroundWriteTo(WriterInterceptorContext context)throws IOException, WebApplicationException {MultivaluedMapString,Object headers context.getHeaders();headers.add(Content-Encoding, gzip);final OutputStream outputStream context.getOutputStream();context.setOutputStream(new GZIPOutputStream(outputStream));context.proceed();}
} 注意 它实现了WriterInterceptor 它是消息正文WriterInterceptor器拦截器的接口该拦截器包装了对javax.ws.rs.ext.MessageBodyWriter.writeTo调用。 实现WriterInterceptor合同的提供程序必须在JAX-RS运行时中以编程方式注册或者必须使用Provider批注进行注释以在提供程序扫描阶段由JAX-RS运行时自动发现。 Compress是名称绑定批注我们将在下一段中对其进行详细讨论 “拦截器从WriterInterceptorContext获取输出流并设置一个新流它是原始输出流的GZIP包装器。 执行完所有拦截器后最后设置为WriterInterceptorContext的输出流将用于实体的序列化。 在上面的示例中实体字节将被写入GZIPOutputStream它将压缩流数据并将其写入原始输出流。 原始流始终是将数据写入“电线”的流。 在服务器上使用拦截器时原始输出流是将数据写入底层服务器容器流的流该流将响应发送到客户端。 [2] “ WriteTo的重写方法将WriterInterceptorContext作为参数。 此上下文包含标头参数请求属性实体实体流和其他属性的获取器和设置器。” [2]; 压缩响应时应将“ Content-Encoding”标头设置为“ gzip” 压缩注释 过滤器和拦截器可以绑定名称 。 名称绑定是一个概念它允许对JAX-RS运行时说仅针对特定资源方法才执行特定过滤器或拦截器。 当过滤器或拦截器仅限于特定资源方法时我们说它是名称绑定的 。 没有这种限制的过滤器和拦截器称为global 。 在我们的案例中我们构建了Compress批注 压缩注释 package org.codingpedia.demo.rest.interceptors;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;import javax.ws.rs.NameBinding;//Compress annotation is the name binding annotation
NameBinding
Retention(RetentionPolicy.RUNTIME)
public interface Compress {} 并用它来标记应该压缩的资源上的方法 例如使用PodcastsResource获取所有播PodcastsResource Compress资源方法上的注释用法 Component
Path(/podcasts)
public class PodcastsResource {Autowiredprivate PodcastService podcastService;.........................../** *********************************** READ ************************************//*** Returns all resources (podcasts) from the database* * return* throws IOException* throws JsonMappingException* throws JsonGenerationException* throws AppException*/GETCompressProduces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })public ListPodcast getPodcasts(QueryParam(orderByInsertionDate) String orderByInsertionDate,QueryParam(numberDaysToLookBack) Integer numberDaysToLookBack)throws IOException, AppException {ListPodcast podcasts podcastService.getPodcasts(orderByInsertionDate, numberDaysToLookBack);return podcasts;}...........................
}2.测试 SOAPui 好吧如果您正在使用SOAPui进行测试则可以针对PodcastsResource发出以下请求。 请求 请求示例 GET http://localhost:8888/demo-rest-jersey-spring/podcasts/?orderByInsertionDateDESC HTTP/1.1
Accept-Encoding: gzip,deflate
Accept: application/json, application/xml
Host: localhost:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)响应 GZipped json响应由SOAPui自动解压缩 HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 409
Server: 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.000100},{id: 1,title: - The Naked Scientists Podcast - Stripping Down Science,linkOnPodcastpedia: http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science,feed: feed_placeholder,description: The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.,insertionDate: 2014-10-29T10:46:02.000100}
] SOAPui可以识别Content-Type: gzip标头已添加到GZIPWriterInterceptor并自动解压缩响应并将其显示为人眼可读。 好就是这样。 您已经了解到Jersey如何直接压缩REST api响应。 提示如果您真的想学习如何在Java中设计和实现REST API请阅读以下教程–借助Jersey和Spring在Java中进行REST API设计和实现 翻译自: https://www.javacodegeeks.com/2014/11/how-to-compress-responses-in-java-rest-api-with-gzip-and-jersey.htmlapi 数据gzip压缩