ライブラリApache Commons HttpClientはGzipをサポートしていますか? Apacheサーバーでenable gzip圧縮を使用してクライアント/サーバー通信を高速化したいと考えました(Androidアプリケーションがサーバーとファイルを同期できるようにするphpページがあります)。
Apache HttpClient 4.1は、コンテンツの圧縮をそのまま使用できるほか、以前は範囲外と見なされていた他の多くの機能をサポートします。
サーバーがGZIP処理されたコンテンツを提供できる場合、Apache Httpクライアント4.1を使用すると、必要なのは
org.Apache.http.impl.client.ContentEncodingHttpClient
これはDefaultHttpClient
のサブクラスです。
このクライアントは、GZIP処理されたコンテンツを受け入れることを示すヘッダーも追加します。
この機能はそのままではサポートされておらず、HttpClient 3.xに追加される可能性は低いと思われます(やや不快なJIRAの問題 こちら を参照)。ただし、カスタムリクエストリーダーと手動のリクエスト/レスポンスストリーム処理を追加することで、基本的なライブラリの上に階層化してそれを行うことができますが、それは面倒です。
あなたはHttpClient 4でそれを行うことができるようですが、少しの努力なしではできません。
かなりお粗末なことですが、私に尋ねると、これは実際よりも簡単なはずです。
4.1以降、Apache HttpClientsはリクエストとレスポンスの圧縮を処理します。
ResponseContentEncoding
api doc here を確認できます。ただ使用する:
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();
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()
}
カスタムプロトコルインターセプター も役立ちます。
免責事項:私はまだこれを試していません。
そのままではサポートしていませんが、次を呼び出すことで、返されたHttpResponse
のエンティティを非圧縮のエンティティに変換できます
val entity = new GzipDecompressingEntity(response.getEntity)
次に、entity.getContent
いつものように。