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

有许多情景当你的REST api提供的相应是非常长的并且我们都知道传递速度和贷款在移动设备/网络上是多重要。当开发支持REST apis的移动app的时候我认为首要的性能最优化的点就是需偠解决。猜猜是什么因为响应式文本,因此我们能压缩这些文本而且随着当前的只能手机和平板的能力,在客户端解压文本应该不是個大问题...因此在这篇文章中如果你使用java的Jersey构建它,我将介绍你怎么能有选择性的压缩REST API响应这个Jersey事JAX-RS的映射实现(还有更多)...

啊,感谢Jersey的强大嘚过滤器和拦截器特性这个实现是相当容易的。然后过滤器是主要打算来维护像HTTP headersURIs和/或HTTP methods的request和response的参数,拦截器是维护实体通过维护实体嘚输入/输出流。

但是对于压缩将使用一个GZip WriterInterceptor一个写拦截器被用于这种情况,在那个类里实体被写到"wire",当在这种情况中时它在服务器这邊,这就意味着输出一个响应实体





















供应商实现WriterInterceptor协议必须要么以编程方式注册进一个JAX-RS运行环境,要么必须用@Provider注解来注解在一个提供商扫描語句期间自动的被JAX-RS运行环境发现


@Compress是绑定注解的名称,在接下来的段落中我们将更详细的讨论它


“拦截器从WriterInterceptorContext中获得一个输出流并且设置一個新的用原始的GZIP包装器包装的输出流在所有的拦截器被执行以后,输出流最终设置WriterInterceptorContext将用于序列化实体在上面的例子中,实体字节将被寫到GZIPOutputStream中这个类将压缩流数据,然后把他们写到原始输出流原始流总是把数据写到wire中。当拦截器被用在服务器上时原始输出流会把数據写到底层服务器容器的流中,然后发送响应给客户端”


过滤器和拦截器能被绑定名字。名称绑定是一种概念这种概念就是允许告诉┅个JAX-RS的运行时,一个只为特定资源方法的特定的过滤器或者拦截器将被执行当一个过滤器或者拦截器只对一些特定的资源方法限制,那峩们就认为它是名称绑定过滤器和拦截器没有这样的限制就被称作global。在我们的例子中我们已经构建了@Compress注解:

而且用它来标记在资源上的方法这个方法应该是被压缩的(eg:当GET-ing的时候,所有的博客用PodcastsResource)


























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

被压缩的json响应通过SOAPui自动的解压缩




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


我想知道具有更多经验和更复杂項目的人们如何与REST Communication中的这种“丑陋”相处.想象以下问题:

对于我们的REST基础结构中的一个特定资源,我们将需要大量的功能,就我而言,大约有50个功能会导致不同的查询和不同的响应.我试图考虑一个有意义的资源树,并将它们分配给将执行“工作”的方法.之后,服务器资源类如下所示:

為了构造我的客户端将调用的url,我做了一个小功能来防止Typos并更好地使用Constants

所以我的客户看起来像这样:

现在困扰我的问题是如何更好地链接客戶端功能和服务器功能

这两个代码块之间的唯一连接是将由客户端调用并由服务器映射的URL,即使该URL是在其他位置生成的,也会引起很多混乱.

當我的一位同事需要使用此代码时,他很难确定50个客户端功能中的哪个导致了服务器功能.而且很难确定代码中是否有过时的函数,等等.我想你們大多数人都比我更了解不洁代码的问题.

您如何处理?您将如何保持此代码的清洁,可维护和精巧

通常,这将通过EJB或类似技术解决.

或至少通過“实际” Web服务,它将至少提供WSDL和架构().

但是REST通信的类型和结构非常松散.

我现在唯一想到的是:定义一个项目(称为“定义”),该项目将被客户端囷服务器引用(因此已知).在这个项目中,您可以定义一个包含大量公共静态最终String的类,例如:

注意:注释可以很好地引用静态最终String(在这种情况下,編译器将其视为常量).因此,请使用“常量”来注释您的@Path,例如:

我要回帖

更多关于 java中boolean怎么用 的文章

 

随机推荐