43

Trước hết, tôi không cố gắng để bắt đầu một cuộc chiến tranh lửa ở đây. Tôi biết Jersey đủ tốt, nhưng hầu như không sử dụng httpclient.Khách hàng của Jersey-client và Apache HTTP so sánh như thế nào?

Sự khác nhau chính giữa jersey-client và httpclient của Apache là gì? Trong khu vực nào tốt hơn khu vực kia? Có một biểu đồ so sánh tốt ở đâu đó không? Cái nào hoạt động tốt hơn với các tệp lớn hơn (giả sử 2048 MB)?

Cảm ơn nhiều ý kiến ​​của bạn!

Trả lời

68

Hai điều này có lẽ không nên so sánh trực tiếp. Jersey là một REST-client, có đầy đủ tính năng triển khai JAX-RS, API thông thạo gọn gàng và ngăn xếp bộ lọc mạnh mẽ. Ứng dụng khách Apache Http là một HTTP-client, hoàn hảo trong việc quản lý các chi tiết cấp thấp như timeouts, các tuyến proxy phức tạp và bỏ phiếu kết nối. Chúng hoạt động trên các cấp độ khác nhau của ngăn xếp giao thức của bạn. Khi bạn đang sử dụng Jersey, luôn có một số loại chương trình phụ trợ khách hàng HTTP có liên quan. Do không có phụ trợ rõ ràng, Jersey sẽ sử dụng HttpUrlConnection làm phụ trợ mặc định.

Jersey với HttpUrlConnection dụ backend:

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

Jersey với Apache Http Khách hàng backend dụ:

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); 

Xin lưu ý sử dụng Handler trong ví dụ trước. Đây là một sự trừu tượng tích hợp quan trọng cho Jersey để kết hợp và sử dụng các backend khác nhau. Ví dụ đầu tiên sử dụng độ sâu URLConnectionClientHandler dưới mui xe.

Nói về hiệu suất và tính năng, bạn nên so sánh Apache Http Client với Jersey. Người ta có thể muốn so sánh các phụ trợ Jersey khác nhau ở đây, vì bản thân Jersey chỉ đơn thuần là một API gói. Tôi muốn nhấn mạnh một số differencies chính giữa HttpUrlConnection và Apache Http khách hàng dựa trên kinh nghiệm của riêng tôi:

HttpUrlConnection

  • Không phụ thuộc bên ngoài là cần thiết. Điều này có thể khá có giá trị trên các nền tảng nhúng hoặc di động.
  • Tài liệu cực kỳ tốt ở mọi nơi
  • Có API được thiết kế kém. HttpUrlConnection thực hiện dựa trên khó khăn để duy trì và mở rộng.
  • Nhiều tính năng được định cấu hình thông qua các thuộc tính JVM, một số tính năng có thể không thể định cấu hình lại trong thời gian chạy.
  • Trong một số trường hợp, vô vọng khi xử lý hết thời gian chờ. Bạn có thể sẽ thiết lập 10 thuộc tính JVM khác nhau cho các thời gian chờ khác nhau và vẫn nhận được kết nối của bạn treo mãi mãi trong một số trường hợp.
  • Vì Gingerbread là một API ứng dụng khách http recommended cho Android.

Apache Http Khách hàng

  • Đối với phiên bản 3.x hiệu suất của nó là hơi tương tự như HttpUrlConnection. Phiên bản 4.1 chứa rất nhiều enchancements hiệu suất và thực hiện cách tốt hơn so với nó đối
  • Khá tốt trong việc quản lý kết nối và dữ liệu đọc timeout
  • Đó là thiết kế sau Open/Closed Principle, vì vậy bạn có thể tùy chỉnh hầu như bất kỳ phần nào của chế biến HTTP với thực hiện của riêng bạn. Ví dụ: chiến lược chuyển hướng, chiến lược thử lại, kho lưu trữ cookie tùy chỉnh, trình chặn cho yêu cầu/phản hồi, v.v.
  • Cung cấp hỗ trợ proxy phong phú với trình tạo tuyến đường tùy chỉnh cho đường dẫn đa proxy phức tạp
  • Đã hết hộp kết nối mỗi tuyến đường . Điều này có thể cung cấp một lợi ích hiệu suất tốt nếu SSL/TLS được sử dụng, đặc biệt là có phần cứng PKCS # 11 mã thông báo có liên quan. HttpUrlConnection cũng có một nội bộ tổng hợp, nhưng bạn không có công cụ để tùy chỉnh những gì hoặc khi nào để bơi, không có cơ sở giám sát để kiểm tra trạng thái hồ bơi.
  • Tính năng chi tiết đăng nhập

Hãy ghi nhớ, rằng nó cũng có thể sử dụng hậu phương khác (ví dụ cho các khách hàng non-blocking) với Jersey nếu bạn có một com.sun.jersey.api.client.ClientHandler thực hiện thích hợp.

+1

Cảm ơn bạn đã chỉ ra thực tế là Jersey mặc định là 'HttpUrlConnection' là một ý tưởng tồi khi sử dụng khi xử lý các tệp lớn vì nó ánh xạ chúng trong bộ nhớ dẫn đến hiệu năng kém. Tôi không hoàn toàn chắc chắn nếu tôi hoàn toàn đồng ý với tuyên bố rằng Jersey chỉ là một khách hàng REST API. Khách hàng Jersey cũng là một khách hàng HTTP. Bạn có tất cả các dòng, nhưng - có - nó kết thúc tốt đẹp tất cả điều này xung quanh HttpUrlConnection theo mặc định. Có lẽ tôi vẫn còn thiếu cái gì đó ...? – carlspring

+1

Nó chắc chắn có các luồng, nhưng các luồng này được cung cấp bởi thực hiện ClientHandler cơ bản. Về mặt lý thuyết, các luồng này có thể xuất phát từ bất cứ đâu, được đệm bộ nhớ hay không - tất cả đều phụ thuộc vào việc triển khai thực hiện ứng dụng khách http cơ bản. Một thậm chí có thể viết ClientHandler mà không liên quan đến bất kỳ mạng và Jersey, như một wrapper, sẽ hoàn toàn ok với điều đó. – Jk1

+2

Bạn có một ví dụ về làm thế nào để có được điều này làm việc với jersey-client 2,20 và Apache Httpclient? Tôi hỏi, bởi vì 'jersey-apache-client4' dường như không có phiên bản đủ mới. Ngoài ra mã của bạn liên quan đến Client Client = new Client (mới ApacheHttpClient4Handler ...) 'bit là không chính xác, hoặc bây giờ đã lỗi thời. Bạn có nghĩ rằng bạn có thể cập nhật điều này? Cảm ơn rất nhiều! – carlspring

Các vấn đề liên quan