質問

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

役に立ちましたか?

解決

Apache httpclient 4.1は、以前は範囲外であると考えられていた他の多くの機能とともに、コンテンツの圧縮を箱から出してサポートしています。

他のヒント

サーバーがGZIPTコンテンツを提供できる場合、Apache HTTPクライアント4.1で必要なのは使用するだけです

org.apache.http.impl.client.ContentEncodingHttpClient

のサブクラスです DefaultHttpClient.

また、このクライアントは、GZIPTコンテンツを受け入れるというヘッダーを追加します。

このすぐにはサポートされておらず、httpclient 3.xに追加される可能性は低いようです(むしろ愚かなJiraの問題を参照してください ここ)。ただし、カスタムリクエストリーダーと手動のリクエスト/応答ストリームの処理を追加して、基本的なライブラリの上に重ねることで行うことができますが、それは気が狂っています。

httpclient 4でそれを行うことができるようですが、ある程度の努力がないわけではありません。

かなり耳障りです、あなたが私に尋ねるなら、このようなものは本当にそれよりも簡単であるはずです。

4.1以降、Apache httpclientsは要求と応答圧縮を処理します。

  • リクエストを圧縮する必要はありません。リクエストヘッダーに「受け入れエンコード」を設定する必要はありません。
  • 応答減圧も自動的に処理し、応答の減圧を処理する必要はありません。
  • 4.3まで、GZIPを処理してデフレートします。確認してもいい ResponseContentEncoding APIドキュメント ここ.

使用するだけです:

HttpClients.custom()

使用:

HttpClientBuilder.create()

ライブラリGOTOをチェックインしたい場合 HttpClientBuilder それは使用しています RequestAcceptEncoding & ResponseContentEncoding

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

これがJava apache-http-clientライブラリを使用するサンプルScalaコードです

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

カスタムプロトコルインターセプター 同様に役立つかもしれません。

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

箱から出してサポートしていませんが、返品のエンティティを変換できます HttpResponse 呼び出して非圧縮されたものに

val entity = new GzipDecompressingEntity(response.getEntity)

次に、続行します entity.getContent いつものように。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top