Apache Commons httpclientはGZIPをサポートしていますか?
-
03-10-2019 - |
質問
ライブラリ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
いつものように。