api 数据gzip压缩_如何使用GZip和Jersey压缩Java REST API中的响应

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 {MultivaluedMap<String,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*/@GET@Compress@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })public List<Podcast> getPodcasts(@QueryParam("orderByInsertionDate") String orderByInsertionDate,@QueryParam("numberDaysToLookBack") Integer numberDaysToLookBack)throws IOException,	AppException {List<Podcast> podcasts = podcastService.getPodcasts(orderByInsertionDate, numberDaysToLookBack);return podcasts;}...........................
}

2.测试

SOAPui

好吧,如果您正在使用SOAPui进行测试,则可以针对PodcastsResource发出以下请求。

请求:

请求示例

GET http://localhost:8888/demo-rest-jersey-spring/podcasts/?orderByInsertionDate=DESC 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.00+0100"},{"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.00+0100"}
]

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.html

api 数据gzip压缩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言心形告白代码实现

1.彩色告白includeincludeincludeincludedefine U 0.1define V 0.053void SetColor(unsigned short ForeColor,unsigned short BackGroundColor){HANDLE hConGetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hCon,(ForeColor)|(BackGroundColor16));}int main(){int …

obs可以推到中转服务器吗,能否使用OBS(Open Broadcaster Software)、FMLE(Flash Media Live Encoder)等第三方软件进行推流?...

"可以。请参考以下方法进行设置。使用OBS进行直播设置 > 串流 > 串流类型&#xff1a;自定义流媒体服务器URL&#xff1a;填写网易服务器提供的推流地址中&#xff0c;从头到live的部分&#xff0c;例如&#xff1a;rtmp://p12345678.live.126.net/live流密钥&#…

mysql 隐藏中间四位_MySQL知识体系——索引

本文直切主题&#xff0c;针对InnoDB引擎描述索引及优化策略。在开始之前&#xff0c;需要读者了解&#xff1a;二叉查找树(包括2-3查找树、红黑树等数据结构)MySQL的InnoDB引擎基础知识索引初探要了解索引&#xff0c;当然要了解其数据结构。树有很多应用&#xff0c;流行的用…

python中属于私有属性的是_Python中的实例属性和私有属性

相关知识点 实例属性 实例属性和类属性的区别在于实例属性定义在类的__init__()魔法方法中&#xff0c;而类属性定义在类下&#xff1a; 1 classC:2 b 1 #类属性 3 4 def __init__(self):5 self.x None #实例属性 对于类属性这里不做说明&#xff0c;主要描述实例属性&#x…

osgi cxf_所有OSGi套件的通用CXF请求拦截器

osgi cxf几个月以来&#xff0c;我一直在研究Apache CXF&#xff0c;Karaf和Felix&#xff0c;我发现所有这些捆绑技术都非常有趣。 在处理一些用例时&#xff0c;我陷入一种情况&#xff0c;即我只需要一个Interceptor即可在发送到Karaf应用程序下部署的任何捆绑包的每个HTTP请…

听说,高手都用记事本写C语言代码?

坊间传闻高手都喜欢用记事本写代码&#xff0c;那么问题来了&#xff0c;我们以C语言为例&#xff0c;如何用记事本编译运行呢&#xff1f;其实&#xff0c;最简单的方式就是安装GCC编译器&#xff0c;在记事本编写C语言程序&#xff0c;然后再在命令行用GCC编译运行。下面&…

精简指令和复杂指令计算机,CPU精简指令集和复杂指令集的区别

经常看到计算机课程上介绍PowerPC是采用精简指令集的CPU&#xff0c;酷睿CPU是复杂指令集。那么到底精简指令集和复杂指令集有什么区别呢&#xff1f;以下内容摘自百度百科&#xff1a;在计算机指令系统的优化发展过程中&#xff0c;出现过两个截然不同的优化方向&#xff1a;C…

均值差异大但是t检验不显著_T检验原理及介绍

T检验原理及应用介绍一、T检验的应用场景&#xff1a;应用场景&#xff1a;可以用于研究工艺更改前后对于产品质量是否有显著提高&#xff1b;研究不同的热处理温度对于产品性能&#xff0c;晶粒度等是否有明显效果&#xff1b;研究不同的设备或人员对于产品质量的影响是否有差…

javafx ui_调用以验证JavaFX UI的响应能力

javafx ui最近&#xff0c;吉姆韦弗&#xff08;Jim Weaver&#xff09;在他的Surface Pro上安装了我的小图片索引应用“ picmodo”作为演示&#xff0c;图形用户界面&#xff08;GUI&#xff09;变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&…

python中mean的用法_Python statistics mean()用法及代码示例

先决条件&#xff1a;统计函数简介 在数据分析和统计方面&#xff0c;Python是一种非常流行的语言。幸运的是&#xff0c;Python3提供了statistics模块&#xff0c;它具有非常有用的功能&#xff0c;例如mean()&#xff0c;median()&#xff0c;mode()等等 mean()函数可用于计算…

C语言多文件编程基本格式

1、背景&#xff1a;用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写2、格式&#xff08;1&#xff09;主函数文件main.c//文件头part1:所有要使用的函数#include ;#include ;#include ;//文件头part2:放所有函数原型的文件#inlucde "main.h"//文件头part3&#…

微软project服务器搭建,Project Professional 版本(Project Server 2010 设置)

Project Professional 版本利用“Project Professional 版本”&#xff0c;您可以指定将能够连接到 Project Server 2010 环境的 Project Professional 客户端的版本(内部版本号)。可通过此设置确保与服务器的 Project Professional 客户端连接都处于所需的基本级别。例如&…

众辰nz200变频器使用说明书_ABB变频器

ABB变频器&#xff0c;广州丰电自动化设备有限公司是一家专业从事工业计算机、工业自动化产品、电线电缆、仪器仪表销售、安装、维修&#xff1b;变频控制系统、变频恒压供水系统、变频节能系统的设计及安装&#xff0c;提供自动化工程技术服务及成套解决方案于一体的科技企业。…

pb 执行存储过程带参数_PB级海量数据服务平台架构设计实践

基于PB级海量数据实现数据服务平台&#xff0c;需要从各个不同的角度去权衡&#xff0c;主要包括实践背景、技术选型、架构设计&#xff0c;我们基于这三个方面进行了架构实践&#xff0c;下面分别从这三个方面进行详细分析讨论&#xff1a;实践背景该数据服务平台架构设计之初…

4g的服务器mysql配置文件,服务器物理内存16G mysql数据库my.cnf配置及参数说明

搜索热词《服务器物理内存16G MysqL数据库my.cnf配置及参数说明》要点&#xff1a;本文介绍了服务器物理内存16G MysqL数据库my.cnf配置及参数说明&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。导读&#xff1a;服务器物理内存16G MysqL数据库my.cnf配置及参…

C语言*运算符和运算符

取址运算符&用来取得其操作数的地址。如果操作数 x 的类型为 T&#xff0c;则表达式 &x 的类型是 T 类型指针&#xff08;指向 T 的指针&#xff09;。取址运算符的操作数必须是在内存中可寻址到的地址。换句话说&#xff0c;该运算符只能用于函数或对象&#xff08;例…

mockito 单元测试_使用FizzBu​​zz和Mockito进行单元测试

mockito 单元测试我有时使用FizzBu​​zz向新手演示单元测试的基础。 尽管FizzBu​​zz确实是一个简单的问题&#xff0c;但它也可以用于演示更高级的单元测试技术&#xff0c;例如模拟 。 FizzBu​​zz Kata&#xff1a; “ 编写一个程序&#xff0c;打印一个从1到100的数字…

css 竖行进度图_前端学习--汇集了大量 CSS 的使用和学习的示例代码

CSS-Inspiration这里可以让你寻找到使用或者是学习 CSS 的灵感&#xff0c;以分类的形式&#xff0c;展示不同 CSS 属性或者不同的课题使用 CSS 来解决的各种方法。目前已有上百种的CSS 实现示例&#xff0c;代码可以拿 来即用LayoutCSS实现瀑布流布局(display: flex)CSS实现瀑…

socket io 不使用redis_Redis这么快,线程模型竟然是单线程

Redis的线程模型记住一句话&#xff1a;单进程单线程&#xff0c;IO多路复用。单线程还这么快&#xff1f;是的&#xff0c;你没有看错&#xff0c;Redis是单线程处理的。这是因为Redis的设计者认为Redis是基于内存的操作&#xff0c;瓶颈在内存或者网络带宽而不是CPU。这样&am…

java 统一处理时区_Java时区处理初学者指南

java 统一处理时区基本时间观念 大多数Web应用程序必须支持不同的时区&#xff0c;而正确处理时区绝非易事。 更糟糕的是&#xff0c;您必须确保各种编程语言&#xff08;例如&#xff0c;前端JavaScript&#xff0c;中间件中的Java和作为数据存储库的MongoDB&#xff09;之间的…