Яку найкращу бібліотеку Java використовувати для HTTP POST, GET тощо? [зачинено]


97

Яку найкращу бібліотеку Java використовувати для HTTP POST, GET тощо з точки зору продуктивності, стабільності, зрілості тощо? Чи існує одна конкретна бібліотека, яка використовується більше, ніж інші?

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

Відповіді:


107

imho: Клієнт Apache HTTP

приклад використання:

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) в розширюваній структурі OO.
    • Підтримує шифрування за допомогою протоколу HTTPS (HTTP через SSL).
    • Гранульована нестандартна конфігурація та відстеження.
    • Прозорі з'єднання через проксі HTTP.
    • Тунельне з'єднання HTTPS через проксі HTTP за допомогою методу CONNECT.
    • Прозорі з'єднання через проксі-сервери SOCKS (версії 4 та 5) з використанням власної підтримки Java-сокета.
    • Аутентифікація за допомогою основних, дайджест та методів шифрування NTLM (NT Lan Manager).
    • Механізм підключення для власних методів автентифікації.
    • Багатокомпонентна форма POST для завантаження великих файлів.
    • Реалізації захисних розеток, що підключаються, полегшують використання сторонніх рішень
    • Підтримка управління підключеннями для використання в багатопотокових програмах. Підтримує встановлення максимальної загальної кількості з'єднань, а також максимальної кількості з'єднань на хост. Виявляє та закриває застарілі зв’язки.
    • Автоматична обробка файлів cookie для читання заголовків Set-Cookie: із сервера та надсилання їх назад у заголовку Cookie: за необхідності.
    • Механізм підключення для користувацьких політик щодо файлів cookie.
    • Запитуйте вихідні потоки, щоб уникнути буферизації будь-якого вмісту, шляхом прямої передачі в сокет на сервер.
    • Вхідні потоки відповіді для ефективного зчитування тіла відповіді шляхом прямої передачі з сокета на сервер.
    • Постійні підключення за допомогою KeepAlive у HTTP / 1.0 та стійкість у HTTP / 1.1
    • Прямий доступ до коду відповіді та заголовків, надісланих сервером.
    • Можливість встановлення часу очікування з’єднання.
    • HttpMethods реалізують шаблон команди, щоб забезпечити паралельні запити та ефективне повторне використання з'єднань.
    • Вихідний код знаходиться у вільному доступі за ліцензією програмного забезпечення Apache.

7
+1 Чудова відповідь: Чудовий приклад. Чудові моменти. Ви дійсно продаєте клієнт Apache HTTP.
therobyouknow

23
Однак документація ЗАСТАВЛЕНА. HttpClient більше не є конкретним класом, це інтерфейс, тому вищевказаний код НЕ ПРАЦЮЄ, оскільки він намагається створити цей інтерфейс HttpClient. Натомість вам доведеться створити екземпляр класу, який реалізує інтерфейс HttpClient, наприклад DefaultHttpClient.
therobyouknow

4
відчувається, що кожен випуск - це занадто багато основних змін ... за ці роки справді розчарований цією бібліотекою .... і тепер вони, здається, витікають із пулу, який у мене встановлено максимум 20 ... grrrrrr .
Дін Хіллер

5
Apache HttpClient, здається, зараз EOL, доступна нова бібліотека Apache.
Ендрю Айлетт,

17
Шановні виборці, ця відповідь була створена майже 5 років тому ...
Кріс


16

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

Деякі причини, чому мені це подобається:

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

По правді кажучи, HTTPClient та Джерсі дуже схожі за реалізацією та 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


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

Чи можу я порадити вам кукурудзяний 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>


5

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.