Эти две вещи, вероятно, не следует сравнивать напрямую. Jersey — это REST-клиент с полной реализацией JAX-RS, плавным API и мощным стеком фильтров. Apache Http Client — это HTTP-клиент, идеально подходящий для управления низкоуровневыми деталями, такими как тайм-ауты, сложные прокси-маршруты и опрос соединений. Они действуют на разных уровнях вашего стека протоколов. Когда вы используете Джерси, всегда задействован какой-то сервер HTTP-клиента. При отсутствии явного бэкэнда Джерси будет использовать 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 является рекомендуемым API HTTP-клиента для Android.
HTTP-клиент Apache
- Для версий 3.X его производительность была несколько похожа на
HttpUrlConnection
. Версия 4.1 содержит множество улучшений производительности и работает намного лучше, чем ее аналог.
- Довольно хорошо справляется с тайм-аутами подключения и чтения данных
- Его дизайн следует принципу Open/Closed, поэтому вы можете настроить практически любую часть обработки HTTP с помощью собственной реализации. Примеры: стратегии перенаправления, стратегии повторных попыток, настраиваемые хранилища файлов cookie, перехватчики запросов/ответов и т. д.
- Обеспечивает расширенную поддержку прокси-серверов с настраиваемыми построителями маршрутов для сложных путей с несколькими прокси-серверами.
- Имеет готовый пул соединений для каждого маршрута. Это может дать хороший выигрыш в производительности, если используется SSL/TLS, особенно при использовании аппаратных токенов PKCS#11.
HttpUrlConnection
также имеет внутренний пул, но у вас нет инструментов для настройки того, что и когда объединять, нет средств мониторинга для проверки состояния пула.
- Особенности подробного ведения журнала
Имейте в виду, что также возможно использовать другие серверные части (например, для неблокирующих клиентов) с Джерси, если у вас есть соответствующая реализация com.sun.jersey.api.client.ClientHandler
.
person
Jk1
schedule
22.10.2013