web-dev-qa-db-ja.com

Apache HttpClient APIのCloseableHttpClientとHttpClientの違いは何ですか?

私は会社が開発したアプリケーションを勉強しています。 Apache HttpClientライブラリを使用します。ソースコードでは、HttpClientクラスを使用して、サーバーに接続するインスタンスを作成します。

Apache HttpClientについて学びたいと思います この一連の例 。すべての例では、CloseableHttpClientの代わりにHttpClientを使用しています。 CloseableHttpClientHttpClientの拡張バージョンだと思います。この場合、2つの質問があります。

  • これら2つの違いは何ですか?
  • 私の新しい開発にはどのクラスを使用することをお勧めしますか?
61
  • HttpClient APIの主要なエントリポイントは、HttpClientインターフェイスです。
  • HttpClientの最も重要な機能は、HTTPメソッドを実行することです。
  • HTTPメソッドの実行には、通常HttpClientによって内部的に処理される1つまたは複数のHTTP要求/ HTTP応答の交換が含まれます。

  • CloseableHttpClientは、Java.io.Closeableも実装するHttpClientの基本実装である抽象クラスです。
  • 最も簡単な形式のリクエスト実行プロセスの例を次に示します。

    CloseableHttpClient httpclient = HttpClients.createDefault(); 
     HttpGet httpget = new HttpGet( "http:// localhost /"); 
     CloseableHttpResponse response = httpclient.execute(httpget); 
     try 
     //何かをする
    }最後に{
     response.close(); 
    }

  • HttpClientリソースの割り当て解除:インスタンスCloseableHttpClientが不要になり、範囲外になろうとする場合、それに関連付けられている接続マネージャーは、呼び出しによってシャットダウンする必要がありますCloseableHttpClient#close()メソッド。

    CloseableHttpClient httpclient = HttpClients.createDefault(); 
     try {
     //何かをする
    }最後に{
     httpclient.close(); 
    }

リファレンス を参照して、基礎を学習してください。


@Scadge Java 7以降、 try-with-resources ステートメントを使用すると、ステートメントの最後で各リソースが閉じられます。

try(CloseableHttpClient httpclient = HttpClients.createDefault()){
//do something with httpclient here
}
82
Sagar Pudi

同じ質問がありました。他の答えは、close()が本当に必要な理由に対処していないようです?また、Opは、HttpClientなどと連携するための好ましい方法を見つけるのに苦労しているようです。


Apache によると:

// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST call CloseableHttpResponse#close() from a finally clause.

さらに、関係は次のようになります。

HttpClient(インターフェース)

実装者:

CloseableHttpClient-ThreadSafe。

DefaultHttpClient-ThreadSafeしかし 非推奨 、代わりにHttpClientBuilderを使用します。

HttpClientBuilder-ThreadSafeではありませんが、ThreadSafe CloseableHttpClientを作成します。

  • CUSTOM CloseableHttpClientの作成に使用します。

HttpClients-ThreadSafeではありませんが、ThreadSafe CloseableHttpClientを作成します。

  • DEFAULTまたはMINIMAL CloseableHttpClientを作成するために使用します。

Apacheによる好ましい方法:

CloseableHttpClient httpclient = HttpClients.createDefault();

彼らが与えることは、finally節でhttpclient.close()を行い、またResponseHandler節も利用します。


別の方法として、mkyongが行う方法も少し興味深いです。

HttpClient client = HttpClientBuilder.create().build();

彼はclient.close()呼び出しを表示しませんが、clientは依然としてCloseableHttpClientのインスタンスなので、必要だと思います。

16
euphoria99

他の回答は、close()が本当に必要な理由に対処していないようです。 * 2

「HttpClientリソース割り当て解除」という答えを疑ってください。

古い3.x httpcomponents doc で言及されていますが、これは長い歴史があり、4.x HCとは大きく異なります。その上、説明は非常に簡潔であるため、この基礎となるリソースが何であるかはわかりません。

4.5.2リリースのソースコードに関する調査を行いましたが、CloseableHttpClient:close()の実装は基本的に接続マネージャーを閉じるだけであることがわかりました。

(FYI)そのため、共有PoolingClientConnectionManagerを使用してクライアントclose()を呼び出すと、例外Java.lang.IllegalStateException: Connection pool shut downが発生します。回避するために、setConnectionManagerSharedは機能します。

私は、notすべてのリクエストの後にCloseableHttpClient:close()することを好みます

リクエストを行うときに新しいhttpクライアントインスタンスを作成し、最終的に閉じていました。この場合、close()を呼び出さないことをお勧めします。接続マネージャに「共有」フラグがない場合、シャットダウンされるため、1回の要求には高すぎます。

実際、Apache HC 4.5のClojureラッパーであるライブラリ clj-http でも、close()を呼び出していません。ファイルのfunc requestを参照してください core.clj

13
mzhang

ライブラリの次のメジャーバージョンでは、HttpClientインターフェイスはCloseableを拡張します。それまでは、以前の4.xバージョン(4.0、4.1、4.2)との互換性が不要な場合は、CloseableHttpClientを使用することをお勧めします。

8
ok2c

HttpClientはクラスではなく、インターフェイスです。意図した方法で開発に使用することはできません。

必要なのは、HttpClientインターフェイスを実装するクラスであり、それはCloseableHttpClientです。

8
M. Sfakianos

CloseableHttpClientは、すべての実装で使用されるhttpclientライブラリの基本クラスです。他のサブクラスの大部分は非推奨です。

HttpClientは、このクラスおよび他のクラスのインターフェースです。

次に、コードでCloseableHttpClientを使用し、HttpClientBuilderを使用して作成する必要があります。特定の動作を追加するためにクライアントをラップする必要がある場合は、HttpClientでラップする代わりに要求インターセプターと応答インターセプターを使用する必要があります。

この答えは、httpclient-4.3のコンテキストで与えられました。

2
polve