首页编程java jersey,如何在java REST API中用GZip和Jersey压缩相应

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

编程之家2023-11-04138次浏览

大家好,关于java jersey很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何在java REST API中用GZip和Jersey压缩相应的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

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

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

有许多情景当你的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吧:

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

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;

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

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)

@Compress annotation在资源方法上的使用

@Component

@Path("/podcasts")

public class PodcastsResource{

@Autowired

private 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.测试

2.1SOAPui

好了,如果你正在用SOAPui测试,你能使用下面的请求违反PodcastsResource

Reqest:

请求例子:

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)

Response:

被压缩的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头,我们在GZIPWriterIntercepter中添加了并且自动的解压了响应并且用人眼可读的方式展示出来。

好了,就这些了。你已经了解了Jersey如何让它直接压缩REST api响应了。

java微服务架构有哪些

微服务有助于开发人员用更低的成本和更少的错误来开发程序。

常用的微服务框架:

1、Spring Boot

Spring Boot是Spring的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便。创建Spring Boot旨在自启动任何类型的Spring项目,而不仅仅是微服务。应用程序完成后,Spring Boot将在Web服务器中混合,并输出一个JAR文件,JVM除外。你可以将其视为原始Docker容器,这也是许多负责构建微服务的开发者都非常喜欢Spring Boot的原因。

2、Dropwizard

Dropwizard框架为开发者提供了一个非常简单的模型,里面包含了许多重要的模块,你可以根据需求添加一些业务逻辑,或者配置其他内容,最后你会发现JAR文件非常小,并且能够快速启动。

Dropwizard最大的限制可能是缺乏依赖注入。如果你希望使用依赖项注入来保持代码的整洁和松散耦合,则需要自己添加库,这点和Spring不同,但是现在Dropwizard也支持大多数功能,包括日志记录、健康检查和提供弹性代码。

3、Cricket

是一个用于快速API开发框架。Cricket很小,尽管它包括许多额外的功能,如键值数据存储,以避免连接数据库和调度程序来控制后台重复处理。没有添加复杂性或其他依赖项,因此很容易将代码添加到Cricket并启动独立的微服务。

4、Jersey

开发web服务的标准方法之一是RESTful web服务的Java API(又名JAX-RS),这是Jersey框架中实现的通用规范。这种方法主要依赖于使用注释来指定路径映射和返回细节。从参数解析到JSON打包的所有其他内容都由Jersey处理。

Jersey的主要优点是它实现了JAX-RS标准,这个特性非常受欢迎,一些开发人员习惯将Jersey与Spring Boot结合在一起使用。

5、Play

体验JVM跨语言能力的最佳方式之一是使用Play框架,这是可以与Java或任何其他JVM语言兼容的。它的基础非常现代,具有异步、无状态的模型,不会让试图跟踪用户及其会话数据的线程使服务器过载。还有许多额外的特性可以用来充实网站,比如OpenID、验证和文件上传支持。Play代码库已经发展了十多年,因此你还会发现类似于对XML的支持的这种古老的功能。play既成熟又轻盈,这种组合还是比较有特色的。

当然,常用的Java微服务框架还有Swagger、Helidon、WildFly Thorntail等,在此就不多赘述了。

希望能帮到你,望采纳!!!

java有哪些好用的REST框架

1 Dropwizard

Dropwizard提供了稳定成熟的Java库,并封装成一个简单的轻量级的包。

Dropwizard介于框架和库之间。它提供了一个开发web应用程序的全部所需。由于内置模块化,一个应用程序可以保持小而精干的特点,减少开发和维护的时间,减少负担。

Dropwizard使用已有的 Jetty HTTP库,嵌入到你的项目中,无需外部的server。所有的Dropwizard项目都有一个 main方法来管理内建的 HTTP server.

2 Jersey

Jersey RESTful框架是开源的RESTful框架,实现了JAX-RS(JSR 311& JSR 339)规范。它扩展了JAX-RS参考实现,提供了更多的特性和工具,可以进一步地简化 RESTful service和 client开发。尽管相对年轻,它已经是一个产品级的 RESTful service和 client框架。

3 Ninja Web Framework

Ninja Web Framework是全栈的 java web framework。稳定,快速,可靠,产品级.

它提供了开发,测试,发布,维护 RESTful web应用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).

就像 DropWizzard, Ninja Web Framework是一个集成的软件栈。你不必建立你自己的,只需使用 Maven archetype生成一个新的项目,导入到IDE中就可以开始编码了。

4

Play Framework

使用Play Framework很容易地创建,构建和发布 web应用程序,支持 Java& Scala。它使用Akka,基于一个轻量级的无状态的架构。它应该应用于大规模地低CPU和内存消耗的应用。

5

Spark Framework

不要和 Apache的大数据框架 Spark弄混,这里的 Spark框架是一个轻量级的 Java web框架,用来进行快速的开发(50% Spark用户使用 Spark创建 REST APIs)。它受 Ruby框架 Sinatra启发。

它有一个不到1M的最小化的内核,提供了所有基本的特性,用来构建 RESTful或者传统的 web应用程序。

OK,关于java jersey和如何在java REST API中用GZip和Jersey压缩相应的内容到此结束了,希望对大家有所帮助。

济南网站导航?山东肥城至济南万智春考路线导航东莞 网站建设?东莞做网站建设公司哪家比较好