2009-08-24 8 views
72

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

Moje wymagania to wysyłanie żądań HTTPS POST do zdalnego serwera. Użyłem pakietu java.net. * W przeszłości, a także pakietu org.apache.commons.httpclient. *. Obaj wykonali zadanie, ale chciałbym poznać niektóre z twoich opinii/zaleceń.

Odpowiedz

81

imho: Apache HTTP Client

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 funkcje Highlight:

  • Standardy oparte czysta Java, implementacja wersji HTTP 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 over SSL).
    • Szczegółowa konfiguracja i śledzenie niestandardowe.
    • Przejrzyste połączenia za pośrednictwem serwerów proxy HTTP.
    • Tunelowane połączenia HTTPS za pośrednictwem serwerów proxy HTTP za pomocą metody CONNECT .
    • Przezroczyste połączenia za pośrednictwem serwerów proxy SOCKS (wersja 4 & 5) przy użyciu standardowej obsługi gniazd Java w systemie .
    • Uwierzytelnianie za pomocą podstawowych, szyfrowanych i zaszyfrowanych metod zarządzania NTLM (NT Lan Manager).
    • Mechanizm wtyczek dla niestandardowych metod uwierzytelniania.
    • Formularz POST dla wielu postów do przesyłania dużych plików.
    • Wtykane implementacje Secure Sockets, dzięki czemu łatwiejsze do rozwiązania partii użycie trzecie
    • wsparcia zarządzania połączeniami do użytku w wielowątkowych zastosowań. Obsługuje ustawianie maksymalnych łącznych połączeń oraz maksymalnych połączeń na hosta. Wykrywa i zamyka nieaktualne połączenia.
    • Obsługa automatycznych plików cookie do odczytywania Set-Cookie: nagłówki z serwera i wysyłanie ich z powrotem do nagłówka Cookie: .
    • Mechanizm wtyczek dla niestandardowych zasad dotyczących plików cookie.
    • Żądaj strumieni wyjściowych, aby uniknąć buforowania treści treści przez przesyłanie strumieniowe bezpośrednio do gniazda na serwer .
    • Reakcje na strumienie wejściowe umożliwiające sprawne odczytanie treści odpowiedzi przez przesyłanie strumieniowe bezpośrednio z gniazda do serwera.
    • Trwałe połączenia przy użyciu KeepAlive w protokole HTTP/1.0 i wartości rezystancji w HTTP/1.1
    • Bezpośredni dostęp do kodu odpowiedzi i nagłówków wysyłanych przez serwer.
    • Możliwość ustawienia limitu czasu połączenia.
    • HttpMethods implementuje wzór polecenia, aby umożliwić równoległe żądania i efektywne ponowne używanie połączeń .
    • Kod źródłowy jest dostępny bezpłatnie pod licencją oprogramowania Apache.
+4

+1 Świetna odpowiedź: świetny przykład. Świetne punkty. Naprawdę sprzedajesz klienta HTTP Apache. – therobyouknow

+17

Mimo to dokumentacja jest WYPRZEDZONA. HttpClient nie jest już klasą konkretną, jest interfejsem, dlatego powyższy kod NIE BĘDZIE PRACOWAŁ, gdy próbuje utworzyć instancję interfejsu HttpClient. Zamiast tego będziesz musiał utworzyć instancję klasy implementującej interfejs HttpClient, na przykład DefaultHttpClient. – therobyouknow

+3

wydaje się, że każde wydanie to zbyt wiele poważnych zmian ... z czasem staje się to frustrujące dla tej biblioteki ... i teraz wydają się przeciekać połączenia z puli, w której mam maksymalnie 20 konfiguracji .... grrrrrr. –

8

zgadzam httpclient jest czymś w rodzaju wzorca - ale myślę, że szukasz opcji więc ...

Restlet dostarcza klientowi http specjalnie zaprojektowane dla interactong z relaksującego usług internetowych.

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

http://www.restlet.org/ Zobacz więcej szczegółów

15

Jestem nieco stronniczy od Jersey. Używamy wersji 1.10 we wszystkich naszych projektach i nie napotkaliśmy problemu, z którym nie moglibyśmy sobie poradzić.

Kilka powodów dlaczego lubię go:

  • Providers - stworzony mydła 1.1/1.2 dostawcy Jersey i wyeliminowały konieczność używania wielkogabarytowych oś, dla naszego JAX-WS zwraca
  • filtry - utworzona baza danych rejestrowanie filtrów w celu rejestrowania całego żądania (w tym nagłówków żądania/odpowiedzi), jednocześnie zapobiegając rejestrowaniu poufnych informacji.
  • JAXB - obsługuje Organizowanie do/z obiektów prosto z żądania/odpowiedzi
  • API jest łatwy w użyciu

W prawdzie, HTTPClient i Jersey są bardzo podobne we wdrażaniu i API. Istnieje również rozszerzenie dla Jersey, które pozwala mu na obsługę HTTPClient.

Niektóre próbki 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 Jersey Klienta: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

4

Mogę polecić corn-httpclient. Jest 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ściami Maven

<dependency> 
    <groupId>net.sf.corn</groupId> 
    <artifactId>corn-httpclient</artifactId> 
    <version>1.0.0</version> 
</dependency> 
1

Chcę wspomnieć o Ning Async Http Client Library. Nigdy go nie używałem, ale mój kolega opowiada o tym w porównaniu do klienta Apache Http, z którego zawsze korzystałem w przeszłości. Byłem szczególnie zainteresowany, aby dowiedzieć się, że jest oparty na Netty, wysokiej wydajności asynchronicznego i/o framework, z którym jestem bardziej znany i cieszą się dużym uznaniem.

Powiązane problemy