Jaka jest najlepsza biblioteka Java do użycia w HTTP POST, GET itp.? [Zamknięte]

99

Jaka jest najlepsza biblioteka Java do użycia w HTTP POST, GET itp. Pod względem wydajności, stabilności, dojrzałości itp.? Czy jest jakaś konkretna biblioteka, która jest używana częściej niż inne?

Moje wymagania to wysyłanie żądań HTTPS POST do zdalnego serwera. W przeszłości korzystałem z pakietu java.net. * Oraz pakietu org.apache.commons.httpclient. *. Obaj wykonali swoją pracę, ale chciałbym poznać Twoje opinie / zalecenia.

rmcc
źródło

Odpowiedzi:

110

moim zdaniem: klient HTTP Apache

przykład użycia:

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();
    }  
  }
}

niektóre najważniejsze funkcje:

  • Oparta na standardach, czysta Java, implementacja HTTP w wersjach 1.0 i 1.1
    • Pełna implementacja wszystkich metod HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS i TRACE) w rozszerzalnej strukturze OO.
    • Obsługuje szyfrowanie za pomocą protokołu HTTPS (HTTP przez SSL).
    • Szczegółowa konfiguracja i śledzenie niestandardowych rozwiązań.
    • Przejrzyste połączenia przez proxy HTTP.
    • Tunelowane połączenia HTTPS przez serwery proxy HTTP za pośrednictwem metody CONNECT.
    • Przezroczyste połączenia przez proxy SOCKS (wersja 4 i 5) przy użyciu natywnej obsługi gniazd Java.
    • Uwierzytelnianie za pomocą metod Basic, Digest i szyfrowania NTLM (NT Lan Manager).
    • Mechanizm wtyczek dla niestandardowych metod uwierzytelniania.
    • Wieloczęściowy formularz POST do przesyłania dużych plików.
    • Implementacje wtykowych bezpiecznych gniazd, ułatwiające korzystanie z rozwiązań innych firm
    • Obsługa zarządzania połączeniami do użytku w aplikacjach wielowątkowych. Obsługuje ustawienie maksymalnej liczby połączeń, a także maksymalnej liczby połączeń na hosta. Wykrywa i zamyka nieaktualne połączenia.
    • Automatyczna obsługa plików cookie do odczytywania nagłówków Set-Cookie: z serwera i wysyłania ich z powrotem w nagłówku Cookie: w razie potrzeby.
    • Mechanizm wtyczki do niestandardowych zasad dotyczących plików cookie.
    • Żądaj strumieni wyjściowych, aby uniknąć buforowania treści przez przesyłanie strumieniowe bezpośrednio do gniazda na serwer.
    • Strumienie wejściowe odpowiedzi, aby efektywnie odczytać treść odpowiedzi, przesyłając strumieniowo bezpośrednio z gniazda do serwera.
    • Stałe połączenia przy użyciu KeepAlive w HTTP / 1.0 i trwałość w HTTP / 1.1
    • Bezpośredni dostęp do kodu odpowiedzi i nagłówków przesłanych przez serwer.
    • Możliwość ustawienia limitów czasu połączenia.
    • HttpMethods implementuje wzorzec polecenia, aby umożliwić równoległe żądania i wydajne ponowne wykorzystanie połączeń.
    • Kod źródłowy jest dostępny bezpłatnie na licencji oprogramowania Apache.
Chris
źródło
7
+1 Świetna odpowiedź: świetny przykład. Świetne punkty. Naprawdę sprzedajesz klienta Apache HTTP.
therobyouknow
24
Dokumentacja jest jednak NIEAKTUALNA. HttpClient nie jest już klasą konkretną, jest interfejsem, dlatego powyższy kod NIE BĘDZIE DZIAŁAŁ podczas próby utworzenia instancji tego interfejsu HttpClient. Zamiast tego musisz utworzyć wystąpienie klasy, która implementuje interfejs HttpClient, na przykład DefaultHttpClient.
therobyouwiecie
4
wydaje się, że każde wydanie zawiera zbyt wiele poważnych zmian ... naprawdę frustruje się tą biblioteką przez lata ... a teraz wydaje się, że wyciekają połączenia z puli, którą mam skonfigurowanych maksymalnie 20 ... grrrrrr .
Dean Hiller
5
Wydaje się, że Apache HttpClient jest teraz EOL, z dostępną nową biblioteką Apache.
Andrew Aylett
18
Drodzy Down-Voters, ta odpowiedź powstała prawie 5 lat temu ...
Chris
16

Jestem trochę stronniczy w stosunku do Jersey . Używamy 1.10 we wszystkich naszych projektach i nie napotkaliśmy problemu, którego nie moglibyśmy za jego pomocą rozwiązać.

Kilka powodów, dla których to lubię:

  • Dostawcy - stworzyli dostawców mydła 1.1 / 1.2 na Jersey i wyeliminowali potrzebę używania nieporęcznego AXIS dla naszych połączeń JAX-WS
  • Filtry - stworzone filtry rejestrujące w bazie danych, które rejestrują całe żądanie (w tym nagłówki żądania / odpowiedzi), jednocześnie zapobiegając rejestrowaniu poufnych informacji.
  • JAXB - obsługuje kierowanie do / z obiektów bezpośrednio z żądania / odpowiedzi
  • API jest łatwe w użyciu

Prawdę mówiąc, HTTPClient i Jersey są bardzo podobne pod względem implementacji i API. Istnieje również rozszerzenie dla Jersey, które pozwala na obsługę HTTPClient.

Niektóre przykłady kodu z 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 z klientem Jersey: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

ElMattIO
źródło
11

Zgadzam się, że httpclient to coś w rodzaju standardu - ale myślę, że szukasz opcji, więc ...

Restlet zapewnia klienta http zaprojektowanego specjalnie do interakcji z usługami sieciowymi Restful.

Przykładowy kod:

    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);

Więcej informacji można znaleźć pod adresem http://www.restlet.org/

Pablojim
źródło
6

Chcę wspomnieć o bibliotece klienta HTTP Ning Async . Nigdy go nie używałem, ale mój kolega zachwyca się nim w porównaniu do klienta HTTP Apache, z którego zawsze korzystałem w przeszłości. Byłem szczególnie zainteresowany, aby dowiedzieć się, że jest oparty na Netty , wysokowydajnym asynchronicznym frameworku I / O, z którym jestem bardziej zaznajomiony i wysoko ceniony.

Josh
źródło
6

Czy mogę polecić Ci corn-httpclient . To proste, szybkie i wystarczające w większości przypadków.

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));

zależność maven

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-httpclient</artifactId>
    <version>1.0.0</version>
</dependency>
Serhat
źródło