簡體   English   中英

Jersey-client和Apache HTTP Client如何比較?

[英]How do Jersey-client and Apache HTTP Client compare?

首先,我不是想在這里開始一場火焰戰爭。 我非常了解澤西島,但很少使用httpclient。

jersey-client和Apache的httpclient之間的主要區別是什么? 哪個區域比另一個好? 在某處有一個很好的比較圖表嗎? 對於較大的文件(比如2048 MB),哪一個表現更好?

非常感謝您的評論!

這兩件事可能不應該直接比較。 Jersey是一個REST客戶端,具有完整的JAX-RS實現,簡潔流暢的API和強大的過濾器堆棧。 Apache Http Client是一個HTTP客戶端,非常適合管理超時,復雜代理路由和連接輪詢等低級細節。 它們作用於協議棧的不同級別。 當您使用Jersey時,總會涉及某種HTTP客戶端后端。 如果沒有顯式后端,Jersey將使用HttpUrlConnection作為默認后端。

澤西與HttpUrlConnection后端示例:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

澤西使用Apache Http Client后端示例:

HttpClient apacheClient = HttpClientBuilder.create().build();
Client client = new Client(new ApacheHttpClient4Handler(apacheClient,
                                                        new BasicCookieStore(),
                                                        true));
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

請注意最后一個示例中Handler的用法。 這是澤西島的一個關鍵整合抽象,可以整合和利用各種后端。 第一個例子深入使用URLConnectionClientHandler

談到性能和功能,將Apache Http Client與Jersey進行比較毫無意義。 人們可能想在這里比較不同的澤西后端,因為澤西島本身只是一個包裝API。 我想根據自己的經驗強調HttpUrlConnection和Apache Http Client之間的一些關鍵差異:

HttpURLConnection的

  • 不需要外部依賴。 這在嵌入式或移動平台上可能非常有價值。
  • 到處都記錄得非常好
  • 設計不佳的API。 基於HttpUrlConnection的實現很難維護和擴展。
  • 許多功能都是通過JVM屬性配置的,其中一些屬性在運行時可能是不可重新配置的。
  • 在某些情況下無望處理超時。 您最終可能會為不同的超時設置10個不同的JVM屬性,並且在某些情況下仍然可以永久保持連接。
  • 由於Gingerbread是Android 推薦的 http客戶端API。

Apache Http客戶端

  • 對於3.X版本,它的性能有點類似於HttpUrlConnection 版本4.1包含許多性能增強,並且執行方式比對應版本更好
  • 非常擅長管理連接和數據讀取超時
  • 它的設計遵循開放/封閉原則 ,因此您可以使用自己的實現自定義HTTP處理的幾乎任何部分。 示例:重定向策略,重試策略,自定義cookie存儲,請求/響應的攔截器等。
  • 為復雜的多代理路徑提供可定制路由構建器的豐富代理支持
  • 具有開箱即用的每個路由連接池。 如果使用SSL / TLS,這可能會帶來良好的性能優勢,特別是涉及硬件PKCS#11令牌。 HttpUrlConnection還有一個內部池,但是你沒有工具可以自定義什么或什么時候池,沒有監控工具來檢查池狀態。
  • 具有詳細的日志

請記住,如果您有適當的com.sun.jersey.api.client.ClientHandler實現,也可以使用Jersey的其他后端(例如,對於非阻塞客戶端)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM