2009-08-24 30 views
72

パフォーマンス、安定性、成熟度などの点でHTTP POST、GETなどに使用するには、最高のJavaライブラリは何ですか?他のライブラリよりも多く使用されているライブラリがありますか?HTTP POST、GETなどに最適なJavaライブラリは何ですか?

私の要件は、HTTPS POST要求をリモートサーバーに送信することです。私は以前のjava.net。*パッケージとorg.apache.commons.httpclient。*パッケージを使用しました。どちらも仕事を終えましたが、私はあなたの意見や提言をしたいと思います。

答えて

81

私見:Apache HTTP Client

使用例:

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
    • 完全実装 拡張可能なOOフレームワーク内のすべてのHTTPメソッド(GET、POST、PUT、DELETE、 HEAD、OPTIONS、およびTRACE)
    • HTTPS(HTTP over SSL)プロトコルによる暗号化をサポートしています。
    • 細かい非標準構成と追跡。
    • HTTPプロキシ経由の透過接続。
    • CONNECT メソッドによるHTTPプロキシ経由のトンネリングHTTPS接続。
    • ネイティブJavaソケットサポートを使用するSOCKSプロキシ(バージョン4 & 5)による透過接続。
    • Basic、Digest、暗号化NTLM(NT Lan Manager)の方法を使用した認証。
    • カスタム認証方式のためのプラグインメカニズム。
    • 大きなファイルをアップロードするための複数パート形式POST。マルチスレッド アプリケーションで使用することが容易に 使用サードパーティのソリューション
    • 接続管理サポートを行う
    • プラグイン可能なセキュアソケットの実装、。最大合計接続数は 、ホストあたりの最大接続数は に設定されています。 古い接続を検出してクローズします。
    • サーバーからSet-Cookie:ヘッダーを読み取り、適切な場合は Cookie:ヘッダーに戻して送信する自動Cookie処理。
    • カスタムCookieポリシーのプラグインメカニズム。
    • サーバーに直接ソケットにストリーミングすることによって、コンテンツ本文のバッファリングを回避する出力ストリームを要求します。
    • レスポンス入力ストリームを効率的に読み取るには、 ソケットを使用して直接サーバーからサーバーに をストリーミングします。
    • HTTP/1.0ではキープアライブを使用し、HTTP/1.0ではパーシスタンス を使用して永続的に接続します。1
    • サーバーから送信されたレスポンスコードとヘッダーに直接アクセスします。
    • 接続タイムアウトを設定する機能。
    • HttpMethodsは、 の要求と、 接続の効率的な再利用を可能にするコマンドパターンを実装しています。
    • ソースコードは、Apache Software Licenseのもとで自由に入手できます。
+4

+1大きな回答:素晴らしい例。素晴らしい点。あなたは本当にApache HTTP Clientを販売しています。 – therobyouknow

+17

ドキュメンテーションは、しかし、日付のうちです。 HttpClientは具象クラスではなく、インタフェースであるため、上記のコードはこのHttpClientインタフェースのインスタンスを作成しようとしても動作しません。代わりに、DefaultHttpClientのようなHttpClientインターフェイスを実装するクラスをインスタンス化する必要があります。 – therobyouknow

+3

それはすべてのリリースがあまりにも多くの大きな変化であると感じています...何年にもわたってこの図書館に本当に不満を抱いていました....そして今、彼らはプールからの接続がリークしているようです。 grrrrrr。 –

8

私はHTTPClientのが標準のようなものであることに同意 - 私はあなたがそうなオプションを探していると思います...

のRestletは特別にRESTfulなWebサービスとinteractongために設計されたHTTPクライアントを提供します。

例コード:

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

は、私は、私もHtmlUnitを見てみることをお勧めしますCommons HttpClient

の後継者をApache HttpComponents HttpClientをお勧めします詳細

15

私はやや部分的にJerseyです。我々はすべてのプロジェクトで1.10を使用し、解決できなかった問題にぶつからない。私はそれを好きな理由

いくつかの理由:

  • プロバイダ - 作成されたSOAP 1.1/1.2ジャージープロバイダと私たちのJAX-WSのためにかさばるAXISを使用する必要性を排除してきたが
  • フィルタを呼び出します - 作成したデータベース機密情報のロギングを防ぎながら要求全体(要求/応答ヘッダーを含む)を記録するためのフィルタを記録する。
  • JAXB - HTTPClientは、ジャージーにマーシャリング/オブジェクトから直接リクエスト/レスポンス
  • APIからは真実では

を使用することは簡単ですサポートする実装と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

4

私はあなたにcorn-httpclientを勧告することができます。ほとんどの場合、シンプルで速く、十分です。それは同様のAndroidとApp Engine上で実行することができますので、

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

私はNing Async Http Client Libraryについて言及したいと思います。私はそれを使用したことはありませんでしたが、私の同僚はこれまでに使用してきたApache Http Clientと比べてそれについて激怒しています。私は特に、それが高性能な非同期I/OフレームワークであるNettyに基づいていることに興味がありました。

関連する問題