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
.
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
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
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