Подтвердить что ты не робот

Альтернативы Apache HttpComponents?

Итак, я пришел к выводу, что 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?

Я знаю: Jetty, hotpotato и AsyncHttpClient.

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

Любые рекомендации?

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

Update

@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, и это просто не работает для меня.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Клиент Google HTTP

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

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

Ответ 5

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

Ответ 6

jsoup

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

Document doc = Jsoup.connect("http://en.wikipedia.org/").get();

Ответ 7

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

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

client.target(REST_SERVICE_URL)
      .path("/{bookId}")
      .resolveTemplate("bookId", bookId)
      .request()
      .get(Book.class);

Ответ 8

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

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

Ответ 9

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