43

Po pierwsze, nie próbuję tutaj rozpętać wojny ogniowej. Znam Jersey wystarczająco dobrze, ale rzadko używam httpclienta.Jak porównują się klient-klient i klient HTTP Apache?

Jakie są kluczowe różnice między klientem jersey a klientem Apache? W jakich obszarach jest jeden lepszy od drugiego? Czy jest gdzieś dobry wykres porównawczy? Który z nich działa lepiej przy większych plikach (na przykład 2048 MB)?

Wielkie dzięki za komentarze!

Odpowiedz

68

Te dwie rzeczy prawdopodobnie nie powinny być porównywane bezpośrednio. Jersey jest klientem REST, z pełną implementacją JAX-RS, zgrabnym interfejsem API i potężnym filtrem. Klient Apache Http jest klientem HTTP, idealnym do zarządzania szczegółami niskiego poziomu, takimi jak limity czasu, złożone trasy proxy i polling połączeń. Działają na różnych poziomach stosu protokołów. Podczas korzystania z Jersey zawsze jest jakiś rodzaj backendu klienta HTTP. Ponieważ nie ma jawnie żadnego backendu, Jersey użyje domyślnego backendu jako HttpUrlConnection.

Jersey HttpURLConnection przykład backend:

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

Jersey z Apache przykład backend Klient:

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

Uwaga wykorzystanie Handler w poprzednim przykładzie. Jest to kluczowa abstrakcja integracyjna dla Jersey w celu włączenia i wykorzystania różnych backendów. Pierwszy przykład używa URLConnectionClientHandler głęboko pod maską.

Mówiąc o wydajności i funkcjach, nie ma sensu porównywać klienta Apache Http z Jersey. Ktoś może chcieć porównać tutaj różne wersje językowe Jersey, jako że sam Jersey jest jedynie zawijanym interfejsem API. Chciałbym wyróżnić kilka kluczowych differencies między HttpURLConnection i Apache Klienta w oparciu o własne doświadczenia:

HttpURLConnection

  • żadnych zależności zewnętrzne są niezbędne. Może to być dość cenne na platformach wbudowanych lub mobilnych.
  • Wyjątkowo dobrze udokumentowana wszędzie
  • Ma słabo zaprojektowane API. HttpUrlConnection - wykonanie na podstawie jest trudne do utrzymania i rozszerzenia.
  • Wiele funkcji jest konfigurowanych za pomocą właściwości maszyny JVM, z których niektóre mogą być niemożliwe do rekonfiguracji podczas wykonywania.
  • W niektórych przypadkach beznadziejny w obsłudze limitów czasu. Może się zdarzyć, że ustawisz 10 różnych właściwości maszyny JVM dla różnych limitów czasu i nadal będziesz mieć możliwość zawieszenia połączeń na zawsze w pewnych okolicznościach.
  • Ponieważ Gingerbread to recommended API klienta HTTP dla Androida.

Apache Client

  • Dla wersji 3.x to występ był nieco podobny do HttpUrlConnection. Wersja 4.1 zawiera wiele enchancements wydajności i wykonuje lepiej niż to odpowiednik
  • Całkiem dobry w zarządzaniu połączenie i odczytać dane timeoutów
  • To projekt następująco Open/Closed Principle, dzięki czemu można dostosować niemal każdy część przetwarzania HTTP z własnej realizacji. Przykłady: przekierowanie strategie, ponowić strategii, magazyny custom cookie przechwytujących dla żądań/odpowiedzi itp
  • Zapewnia bogate wsparcie proxy z konfigurowalny budowniczych tras dla złożonych ścieżek multy-proxy
  • Has po wyjęciu z pudełka puli połączeń na trasie . Może to dawać dobre wyniki, jeśli używany jest protokół SSL/TLS, w szczególności z użyciem tokenów PKCS # 11. HttpUrlConnection ma również wewnętrzne pulowanie, ale nie masz żadnych narzędzi do dostosowywania tego, co lub kiedy gromadzić, żadnych funkcji monitorowania, aby sprawdzić stan puli.
  • Opis szczegółowy zalogowaniu

Należy pamiętać, że można również stosować inne bazami (np dla klientów non-blocking) z Jersey, jeśli masz odpowiednią realizację com.sun.jersey.api.client.ClientHandler.

+1

Dzięki za wskazanie, że Jersey domyślnie stosuje 'HttpUrlConnection', co jest złym pomysłem do wykorzystania w przypadku dużych plików, ponieważ mapuje je w pamięci, co prowadzi do niskiej wydajności. Nie jestem do końca pewien, czy w pełni zgadzam się ze stwierdzeniem, że Jersey jest tylko klientem REST API. Klient Jersey jest również klientem HTTP. Masz wszystkie strumienie, ale - tak - wszystko to jest domyślnie zawijane wokół HttpUrlConnection. Może nadal czegoś brakuje ...? – carlspring

+1

Z pewnością ma strumienie, ale strumienie te są dostarczane przez podstawową implementację ClientHandler. Teoretycznie strumienie te mogą pochodzić z dowolnego miejsca, być buforowane lub nie - wszystko zależy od implementacji klienta HTTP. Można nawet napisać ClientHandler, który nie wymaga żadnej sieci, a Jersey, jako opakowanie, będzie w pełni z tym w porządku. – Jk1

+2

Czy masz przykład tego, jak uzyskać to działając z jersey-client 2.20 i Apache Httpclient? Pytam, ponieważ 'jersey-apache-client4' nie ma wystarczająco nowej wersji. Również twój kod dotyczący 'Client client = new Client (nowy ApacheHttpClient4Handler ...)' bit jest niepoprawny lub jest już nieaktualny. Czy myślisz, że mógłbyś to zaktualizować? Wielkie dzięki! – carlspring

Powiązane problemy