Альтернативы Apache HttpComponents? - PullRequest
49 голосов
/ 24 марта 2011

Итак, я пришел к выводу, что Apache HttpComponents 4 является одним из самых перегруженных API, с которыми я когда-либо сталкивался. Вещи, которые кажутся простыми, занимают сотни строк кода (а я все еще не уверен, что ресурсы очищены правильно).

Кроме того, он хочет, чтобы я делал такие вещи, как:

List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", 
  URLEncodedUtils.format(qparams, "UTF-8"), null);

Что, просто ... нет. Я знаю, что это Java, и мы не очень ценим краткость, но это немного. Не говоря уже о банках до 700 КБ.

В любом случае, достаточно разглагольствования, я хотел посмотреть, какой опыт люди испытывали с другими клиентскими библиотеками HTTP?

Мне известны следующие сообщения: Причал , hotpotato и AsyncHttpClient .

Это для использования на стороне сервера, меня больше всего интересует производительность для многих одновременных операций получения и передачи больших файлов.

Есть рекомендации?

PS Я знаю, что почтенный HttpClient 3.1 все еще там, но я хотел бы использовать кое-что, что поддерживается.

Обновление

@ oleg: вот что предлагают документы:

    HttpClient httpclient = new DefaultHttpClient();
    try {
        HttpGet httpget = new HttpGet("http://www.apache.org/");
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            try {
                instream.read();
            } catch (IOException ex) {
                throw ex;
            } catch (RuntimeException ex) {
                httpget.abort();
                throw ex;
            } finally {
                try { instream.close(); } catch (Exception ignore) {}
            }
        }
    } finally {
        httpclient.getConnectionManager().shutdown();
    }

Я по-прежнему получаю неожиданные ошибки при использовании содержимого сущности при использовании ThreadSafeClientConnManager. Я уверен, что это моя вина, но на данный момент я не хочу выяснять это.

Эй, я не хочу принижать чью-либо работу здесь, но я добросовестно стараюсь использовать HttpComponents с момента выхода 4.0, и это просто не работает для меня.

Ответы [ 9 ]

20 голосов
/ 24 марта 2011

Сложность HttpClient API просто отражает сложность его проблемной области.Вопреки распространенному заблуждению HTTP является довольно сложным протоколом.Будучи низкоуровневой транспортной библиотекой, HC 4.0 API был в первую очередь оптимизирован для производительности и гибкости, а не для простоты.К сожалению, вы не можете понять это, но так и будет.Вы можете использовать любую библиотеку, которая соответствует вашим потребностям лучше всего.Лично мне очень нравится Jetty HttpClient .Это отличная альтернатива, которая может работать лучше для вас.

16 голосов
/ 17 августа 2013

Для простых случаев использования вы можете использовать HttpClient Fluent API .См. учебные пособия .

. Этот модуль предоставляет простой в использовании API фасадов для HttpClient, основанный на концепции свободного интерфейса.Fluent фасад API предоставляет только самые основные функции HttpClient и предназначен для простых случаев использования, которые не требуют полной гибкости HttpClient.Например, свободный интерфейс API фасадов освобождает пользователей от необходимости иметь дело с управлением соединениями и освобождением ресурсов

    // Execute a GET with timeout settings and return response content as String.
 Request.Get("http://somehost/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute().returnContent().asString();

артефакт Maven.

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.2.5</version>
</dependency>
6 голосов
/ 30 марта 2012

Отвечая на мой собственный вопрос, так как этот вопрос почему-то воскрес.

Я закончил тем, что написал несколько простых оберток вокруг java.net.HttpURLConnection, кажется, что с прошлого раза он прошел долгий путьЯ серьезно об этом подумал.

Apache HttpComponents великолепен, но может быть излишним для простых задач.Кроме того, по крайней мере в моем сценарии, HUC заметно быстрее (в основном однопоточный, не выполнял никаких испытаний под большой нагрузкой).

4 голосов
/ 22 февраля 2014

Google HTTP Client

Другая библиотека Google HTTP Client Library для Java .

Созданная Google, эта библиотека является гибкой, эффективной имощная клиентская библиотека Java для доступа к любому ресурсу в сети через HTTP.Он имеет подключаемую HTTP-абстракцию транспорта, которая позволяет использовать любую низкоуровневую библиотеку, такую ​​как java.net.HttpURLConnection, Apache HTTP Client или URL Fetch в Google App Engine.Он также содержит эффективные модели данных JSON и XML для анализа и сериализации HTTP-ответа и содержимого запроса.Библиотеки JSON и XML также полностью подключаемы, включая поддержку библиотек Джексона и Android GSON для JSON.

3 голосов
/ 10 февраля 2015

Я фанат клиентского API из JAX-RS (стандартизирован в 2.0) и реализации Джерси в частности. Он поддерживает асинхронный режим и имеет коннекторы , поэтому он может быть поддержан Apache HttpComponents, обычным HttpUrlConnection, Jetty или Grizzly.

Есть несколько хороших примеров использования здесь , включая следующие.

client.target(REST_SERVICE_URL)
      .path("/{bookId}")
      .resolveTemplate("bookId", bookId)
      .request()
      .get(Book.class);
3 голосов
/ 12 апреля 2014

jsoup

jsoup - это библиотека, предназначенная для анализа файлов HTML. Он делает HTTP-вызовы для получения исходного кода веб-страницы.

Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
3 голосов
/ 24 марта 2011

Вы можете использовать Netty или Apache Mina , хотя они очень низкого уровня, и я не уверен, что у вас получится меньше подробного кода.

1 голос
/ 29 марта 2012

Вы можете взглянуть на возможности клиента Restlet . Это слой выше, который может поддерживаться, например, Apache HttpComponents или Java Net API.

1 голос
/ 28 марта 2012

HTTPUnit имеет отличный интерфейс (не требуется много кода), но последняя версия отправляет повторяющиеся запросы.

HTMLUnit будет работать, но для меня, похоже, ограниченная поддержка Javascript.Я смог использовать его для основных веб-страниц.

...