webdevqa.jp.net

Apache Commons HttpClientはGZIPをサポートしていますか?

ライブラリApache Commons HttpClientはGzipをサポートしていますか? Apacheサーバーでenable gzip圧縮を使用してクライアント/サーバー通信を高速化したいと考えました(Androidアプリケーションがサーバーとファイルを同期できるようにするphpページがあります)。

30
benstpierre

Apache HttpClient 4.1は、コンテンツの圧縮をそのまま使用できるほか、以前は範囲外と見なされていた他の多くの機能をサポートします。

27
ok2c

サーバーがGZIP処理されたコンテンツを提供できる場合、Apache Httpクライアント4.1を使用すると、必要なのは

org.Apache.http.impl.client.ContentEncodingHttpClient

これはDefaultHttpClientのサブクラスです。

このクライアントは、GZIP処理されたコンテンツを受け入れることを示すヘッダーも追加します。

17
Denys

この機能はそのままではサポートされておらず、HttpClient 3.xに追加される可能性は低いと思われます(やや不快なJIRAの問題 こちら を参照)。ただし、カスタムリクエストリーダーと手動のリクエスト/レスポンスストリーム処理を追加することで、基本的なライブラリの上に階層化してそれを行うことができますが、それは面倒です。

あなたはHttpClient 4でそれを行うことができるようですが、少しの努力なしではできません。

かなりお粗末なことですが、私に尋ねると、これは実際よりも簡単なはずです。

8
skaffman

4.1以降、Apache HttpClientsはリクエストとレスポンスの圧縮を処理します。

  • リクエストを圧縮する必要はなく、リクエストヘッダーに「Accept-Encoding」を設定する必要もありません。
  • 応答の解凍も自動的に処理するため、応答の解凍を処理する必要はありません。
  • 4.3までは、gzipとdeflateを処理します。 ResponseContentEncoding api doc here を確認できます。

ただ使用する:

HttpClients.custom()

使用するもの:

HttpClientBuilder.create()

ライブラリgoto HttpClientBuilderをチェックインする場合は、RequestAcceptEncodingResponseContentEncodingを使用します

"disableContentCompression()"で無効にできます

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .disableContentCompression() //this disables compression
                .build();

オーバーライドできるインターセプターを追加する場合は、慎重に使用してください。

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setHttpProcessor(httpprocessor) //this interceptor can override your compression.
                .build();
4
Garry

scalaを使用するコードのサンプルJava Apache-http-client library

 def createCloseableHttpClient(): CloseableHttpClient = {
    val builder: HttpClientBuilder = HttpClientBuilder.create
    val closableClient = builder.build()
    closableClient
  }

  def postData(data: String): Unit = {
    val entity = EntityBuilder.create()
      .setText(data)
      .setContentType(ContentType.TEXT_PLAIN)
      .gzipCompress()
      .build()
    val post = new HttpPost(postURL + endPoint)
    post.setEntity(entity)
    post.setHeader("Content-Type", "application/gzip")
    val client = createCloseableHttpClient()
    client.execute(post)
    client.close()
  }
1
Knight71

カスタムプロトコルインターセプター も役立ちます。

免責事項:私はまだこれを試していません。

0

そのままではサポートしていませんが、次を呼び出すことで、返されたHttpResponseのエンティティを非圧縮のエンティティに変換できます

val entity = new GzipDecompressingEntity(response.getEntity)

次に、entity.getContent いつものように。

0
expert