问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在java REST API中用GZip和Jersey压缩相应

发布网友 发布时间:2022-04-27 04:44

我来回答

1个回答

热心网友 时间:2022-04-14 10:16

  有许多情景当你的REST api提供的相应是非常长的,并且我们都知道传递速度和贷款在移动设备/网络上是多重要。当开发支持REST apis的移动app的时候,我认为首要的性能最优化的点就是需要解决。猜猜是什么?因为响应式文本,因此我们能压缩这些文本。而且随着当前的只能手机和平板的能力,在客户端解压文本应该不是个大问题...因此在这篇文章中,如果你使用java的Jersey构建它,我将介绍你怎么能有选择性的压缩REST API响应,这个Jersey事JAX-RS的映射实现(还有更多)...
  1.Jersey过滤器和*
  啊,感谢Jersey的强大的过滤器和*特性,这个实现是相当容易的。然后过滤器是主要打算来维护像HTTP headers,URIs和/或HTTP methods的request和response的参数,*是维护实体,通过维护实体的输入/输出流。
  但是对于压缩将使用一个GZip WriterInterceptor,一个写*被用于这种情况,在那个类里,实体被写到"wire",当在这种情况中时,它在服务器这边,这就意味着输出一个响应实体。
  1.1GZip Writer Interceptor
  那让我们来看看我们的GZip Writer Interceptor吧:
  GZip Writer Interceptor
  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 {
  @Override
  public void aroundWriteTo(WriterInterceptorContext context)
  throws IOException, WebApplicationException {

  MultivaluedMap<String,Object> headers = context.getHeaders();
  headers.add("Content-Encoding", "gzip");

  final OutputStream outputStream = context.getOutputStream();
  context.setOutputStream(new GZIPOutputStream(outputStream));
  context.proceed();
  }
  }
  注意:
  它实现了WriterInterceptor,这是一个写*的消息体的接口,这个接口包装调用javax.ws.rs.ext.MessageBodyWriter.writeTo
  供应商实现WriterInterceptor协议必须要么以编程方式注册进一个JAX-RS运行环境,要么必须用@Provider注解来注解在一个提供商扫描语句期间自动的被JAX-RS运行环境发现。
  @Compress是绑定注解的名称,在接下来的段落中我们将更详细的讨论它
  “*从WriterInterceptorContext中获得一个输出流并且设置一个新的用原始的GZIP包装器包装的输出流。在所有的*被执行以后,输出流最终设置WriterInterceptorContext将用于序列化实体。在上面的例子中,实体字节将被写到GZIPOutputStream中,这个类将压缩流数据,然后把他们写到原始输出流。原始流总是把数据写到wire中。当*被用在服务器上时,原始输出流会把数据写到底层服务器容器的流中,然后发送响应给客户端。”
  “重载方法aroundWriteTo()获取WriterInterceptorContextz作为参数。这个上下文包括请求头参数getters和setters,请求属性,实体,实体流和其它属性;当你压缩你的响应时,你应当设置'Content-Encoding'头位gzip”
  1.2 压缩注解
  过滤器和*能被绑定名字。名称绑定是一种概念,这种概念就是允许告诉一个JAX-RS的运行时,一个只为特定资源方法的特定的过滤器或者*将被执行。当一个过滤器或者*只对一些特定的资源方法*,那我们就认为它是名称绑定。过滤器和*没有这样的*就被称作global。在我们的例子中我们已经构建了@Compress注解:
  Compress annotation
  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 {}
  而且用它来标记在资源上的方法,这个方法应该是被压缩的(eg:当GET-ing的时候,所有的博客用PodcastsResource)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
网上订酒店哪个网好 经常听了歌就使劲摇头,长期会对大脑有什么影响吗 携程有什么优点 吉娃娃幼犬多少钱一只吉娃娃犬多少钱一只黑龙江省那有卖 吉娃娃现在多少钱一只? 预防中风的小动作有哪些呢? 京巴,吉娃娃,这类小型宠物狗大概多少钱? 摇头时颈椎有响声 旅行社怎么和携程合作推广旅游线路 不是纯种的吉娃娃狗狗能卖多少钱呢 JAVA 与 c# GZIp 如何解压java 压缩的 gzip字符串 java后台怎么接收一个gzip压缩流,并且解析接受参数 C# 中GZIP 压缩,求在JAVA中解压代码 在java中,gzip 压缩和解压多个文件? java怎么用Gzip实现文件的压缩和解压缩的? java程序如何批量解压GZIP压缩包 奥运会会标和会旗图片,以及代表的意义!好的话还有追加分50-80! ip camera无线监控网络摄像头 百万高清wifi数字摄像机 960p家用怎么安装 手机远程无线wlfl监控网络摄像头960p高清数字一体插卡摄像机怎样配置数据 谁有关于维也纳的资料和图片? 城市土地生态规划的主要内容是》? 惟民安 960p无线摄像头 网络监控一体机好用吗 960P高清网络摄像机一天储存多G? 世博会的历史图片 我国哪些城市对滨水的旧城区进行改造,取得了比较好的效果? 安民威视960P数字网络摄像机详情 生态绿地规划的内容? 奥运会的五环旗颜色从左到右怎么排列 960p网络无线摄像头手机高清监控wifi智能摄像机 怎么安装呢? 在java中,如何将含有多个文件的gzip解压? java端用GZIPOutputStream压缩的数据,通过HTTP POST到PHP写的后台,怎么不能解压? java web 、SSH框架、需要Gzip压缩动态页面、不知道该怎么写、跪求帮助。 java怎么判断一串字符串是否是GZIPOutputStream后的内容 是否能用delphi的zlib解压java gzip压缩的字符串 PHP GZIP 和 JAVA GZIPInputStream 减肥水煮蛋一天可以吃几个 鸡蛋一天最多可以吃几个 鸡蛋一天最多能吃几个? 鸡蛋一天最多可以吃几个? 鸡蛋一天最多能吃几个 鸡蛋可以吃几个 一天最多能吃几个鸡蛋? 鸡蛋 一天能吃几个啊 新注册的qq号怎么登录微信 优盘在打开前提示要被格式化,怎么办??? 打开U盘,提示格式化怎么回事? 请问一种要吃荣誉证书红色绒的是什么虫? 看图片,有没有毒?我摸着了! 有种,闽南语叫竹鼠,但网上查不到,身上毛很漂亮,有白,红之类的颜色不像老鼠 贵州铜仁印江办酒席红扣肉怎么做的