本文目錄一覽:
java中的jersey是幹什麼用的
jersey在國內用的比較多,相當於java中的spring,是一種輕量級的框架。主要是以restful風格來編程。
java中的jersey和jetty的區別
區別太大了:
jersey相當於spring,是一種框架,主要是用於restful風格,比spring輕量級,但功能卻不弱;
jetty相當於tomcat,是容器。
綜上,jersey和jetty完全是兩碼事兒。
如何在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吧:
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 {
MultivaluedMapString,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;
原創文章,作者:FHRWO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130834.html