Какую библиотеку Java лучше всего использовать для HTTP POST, GET и т. Д.? [закрыто]

101

Какую библиотеку Java лучше всего использовать для HTTP POST, GET и т. Д. С точки зрения производительности, стабильности, зрелости и т. Д.? Есть ли одна конкретная библиотека, которая используется больше других?

Мои требования отправляют запросы HTTPS POST на удаленный сервер. Раньше я использовал пакет java.net. *, А также пакет org.apache.commons.httpclient. *. Оба сделали свою работу, но я хотел бы получить некоторые ваши мнения / рекомендации.

rmcc
источник

Ответы:

110

imho: HTTP-клиент Apache

пример использования:

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.*;

public class HttpClientTutorial {

  private static String url = "http://www.apache.org/";

  public static void main(String[] args) {
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();

    // Create a method instance.
    GetMethod method = new GetMethod(url);

    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
            new DefaultHttpMethodRetryHandler(3, false));

    try {
      // Execute the method.
      int statusCode = client.executeMethod(method);

      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + method.getStatusLine());
      }

      // Read the response body.
      byte[] responseBody = method.getResponseBody();

      // Deal with the response.
      // Use caution: ensure correct character encoding and is not binary data
      System.out.println(new String(responseBody));

    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      // Release the connection.
      method.releaseConnection();
    }  
  }
}

некоторые особенности:

  • На основе стандартов, чистая Java, реализация HTTP версий 1.0 и 1.1
    • Полная реализация всех HTTP-методов (GET, POST, PUT, DELETE, HEAD, OPTIONS и TRACE) в расширяемой структуре объектно-ориентированного программирования.
    • Поддерживает шифрование по протоколу HTTPS (HTTP через SSL).
    • Детальная нестандартная настройка и отслеживание.
    • Прозрачные соединения через HTTP-прокси.
    • Туннелированные HTTPS-соединения через HTTP-прокси с помощью метода CONNECT.
    • Прозрачные соединения через прокси SOCKS (версии 4 и 5) с использованием встроенной поддержки сокетов Java.
    • Аутентификация с использованием методов Basic, Digest и NTLM (NT Lan Manager) с шифрованием.
    • Подключаемый механизм для пользовательских методов аутентификации.
    • Многостраничная форма POST для загрузки больших файлов.
    • Реализация подключаемых защищенных сокетов, упрощающая использование сторонних решений
    • Поддержка управления подключениями для использования в многопоточных приложениях. Поддерживает установку максимального общего количества подключений, а также максимального количества подключений на хост. Обнаруживает и закрывает устаревшие соединения.
    • Автоматическая обработка файлов cookie для чтения заголовков Set-Cookie: с сервера и отправки их обратно в заголовке Cookie: при необходимости.
    • Подключаемый механизм для настраиваемых политик cookie.
    • Запрашивайте выходные потоки, чтобы избежать буферизации тела содержимого путем потоковой передачи непосредственно в сокет на сервер.
    • Потоки ввода ответа для эффективного чтения тела ответа путем потоковой передачи непосредственно из сокета на сервер.
    • Постоянные соединения с использованием KeepAlive в HTTP / 1.0 и постоянства в HTTP / 1.1
    • Прямой доступ к коду ответа и заголовкам, отправленным сервером.
    • Возможность устанавливать таймауты подключения.
    • HttpMethods реализует шаблон команды, чтобы обеспечить параллельные запросы и эффективное повторное использование соединений.
    • Исходный код доступен бесплатно по лицензии на программное обеспечение Apache.
Крис
источник
7
+1 Отличный ответ: Отличный пример. Отличные очки. Вы действительно продаете HTTP-клиент Apache.
therobyouknow
24
Однако документация УСТАРЕЛА. HttpClient больше не является конкретным классом, это интерфейс, поэтому приведенный выше код НЕ БУДЕТ РАБОТАТЬ, поскольку он пытается создать экземпляр этого интерфейса HttpClient. Вместо этого вам придется создать экземпляр класса, реализующего интерфейс HttpClient, например DefaultHttpClient.
therobyouknow
4
кажется, что в каждом выпуске слишком много серьезных изменений ... за эти годы я действительно разочаровался в этой библиотеке ... и теперь они, похоже, утекают соединения из пула, который у меня настроен максимум 20 .... grrrrrr .
Дин Хиллер,
5
Apache HttpClient, похоже, сейчас EOL, с доступной новой библиотекой Apache.
Эндрю Айлетт
18
Уважаемые сторонники отрицательного голосования, этот ответ был создан почти 5 лет назад ...
Крис,
16

Я несколько неравнодушен к Джерси . Мы используем 1.10 во всех наших проектах и ​​не сталкивались с проблемами, которые не могли бы решить с его помощью.

Некоторые причины, почему мне это нравится:

  • Провайдеры - создали провайдеров мыла 1.1 / 1.2 в Джерси и устранили необходимость использовать громоздкую AXIS для наших вызовов JAX-WS.
  • Фильтры - созданные фильтры ведения журнала базы данных для регистрации всего запроса (включая заголовки запроса / ответа), предотвращая регистрацию конфиденциальной информации.
  • JAXB - поддерживает маршалинг в / из объектов прямо из запроса / ответа
  • API прост в использовании

По правде говоря, HTTPClient и Jersey очень похожи по реализации и API. Также существует расширение для Джерси, которое позволяет поддерживать HTTPClient.

Некоторые примеры кода с Jersey 1.x: https://blogs.oracle.com/enterprisetechtips/entry/consuming_restful_web_services_with

http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/

HTTPClient с клиентом из Джерси: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

ElMattIO
источник
11

Я согласен, что httpclient - это что-то вроде стандарта, но я думаю, вы ищете варианты, поэтому ...

Restlet предоставляет http-клиент, специально разработанный для взаимодействия с веб-сервисами Restful.

Пример кода:

    Client client = new Client(Protocol.HTTP);
    Request r = new Request();
    r.setResourceRef("http://127.0.0.1:8182/sample");
    r.setMethod(Method.GET);
    r.getClientInfo().getAcceptedMediaTypes().add(new Preference<MediaType>(MediaType.TEXT_XML));
    client.handle(r).getEntity().write(System.out);

См. Http://www.restlet.org/ для получения более подробной информации.

Паблоджим
источник
6

Хочу упомянуть клиентскую библиотеку Ning Async Http . Я никогда не использовал его, но мой коллега в восторге от него по сравнению с Apache Http Client, которым я всегда пользовался в прошлом. Мне было особенно интересно узнать, что он основан на Netty , высокопроизводительной среде асинхронного ввода-вывода, с которой я больше знаком и высоко ценю.

Джош
источник
6

Могу я порекомендовать вам corn-httpclient . Это просто, быстро и достаточно для большинства случаев.

HttpForm form = new HttpForm(new URI("http://localhost:8080/test/formtest.jsp"));
//Authentication form.setCredentials("user1", "password");
form.putFieldValue("input1", "your value");
HttpResponse response = form.doPost();
assertFalse(response.hasError());
assertNotNull(response.getData());
assertTrue(response.getData().contains("received " + val));

зависимость от maven

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-httpclient</artifactId>
    <version>1.0.0</version>
</dependency>
Серхат
источник