質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1122閲覧

[JAVA][HttpClient4.5]レスポンスが圧縮されない

cima

総合スコア12

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/12/16 16:19

編集2017/12/17 17:28

HttpClient4.5を使用して、リクエストヘッダにAccept-Encoding=gzipを設定して
ウェブサイトに送信しましたが返ってくるのは非圧縮のデータです。

エクリプス等でソースを実行するだけで確認出来るようにしているので
結果だけでも書いてくれたら助かります。

###該当のソースコード

import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPInputStream; import org.apache.commons.io.IOUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.LaxRedirectStrategy; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class HttpClientV4Test { public void executeV4getTest() throws IOException { System.out.println(new Object() { }.getClass().getEnclosingMethod().getName() + " start"); HttpGet method = null;// getメソッド try { /*- * URL */ method = new HttpGet("https://www.blogger.com/about/?hl=ja"); System.out.println("url : " + method.getURI()); /*- * リクエストヘッダ */ List<Header> requestHeaders = new ArrayList<Header>(); requestHeaders.add(new BasicHeader("Host", "www.blogger.com")); requestHeaders.add(new BasicHeader("Connection", "Keep-Alive")); requestHeaders .add(new BasicHeader( "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36")); requestHeaders .add(new BasicHeader( "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")); requestHeaders.add(new BasicHeader("Accept-Encoding", "gzip, deflate")); requestHeaders.add(new BasicHeader("Accept-Language", "ja-JP")); System.out.println("requestHeaders : "); for (Header header : requestHeaders) { System.out .println(header.getName() + " : " + header.getValue()); } /*- * クライアント */ CloseableHttpClient client = HttpClientBuilder.create() .setDefaultHeaders(requestHeaders) .setRedirectStrategy(new LaxRedirectStrategy())// HTTPステータスが301,302の場合は自動でリダイレクトする .build(); /*- * サーバへの送信~レスポンスの受信 */ HttpResponse response = client.execute(method); System.out.println("status : " + response.getStatusLine().getStatusCode()); /*- * レスポンスヘッダを保存 */ Header[] headers = response.getAllHeaders(); System.out.println("responseHeaders : "); for (Header header : headers) { System.out .println(header.getName() + " : " + header.getValue()); } /*- * キャラクターセットを取得 */ String contentType = response.getEntity().getContentType() .getValue(); int charsetIndex = contentType.indexOf("charset="); String charset = "UTF-8"; if (charsetIndex != -1) { charset = contentType .substring(contentType.indexOf("charset=") + 8); } /*- * レスポンスボディがgzipであるか確認 */ boolean gzip = false; for (Header header : headers) { if (header.getName().equals("Content-Encoding") && header.getValue().equals("gzip")) { gzip = true; break; } } /*- * レスポンスボディの読込 */ String body = null; if (gzip) { System.out.println("*******************recieve gzip data*******************"); GZIPInputStream zippedInputStream = new GZIPInputStream( response.getEntity().getContent()); body = IOUtils.toString(zippedInputStream, charset); } else { System.out.println("*******************recieve TEXT data*******************"); body = EntityUtils.toString(response.getEntity(), charset); } // System.out.println("responseBody : " + body); } finally { /*- * TCP RST送信 */ if (method != null) { method.releaseConnection(); } } System.out.println(new Object() { }.getClass().getEnclosingMethod().getName() + " finsh"); } public static void main(String[] args) { try { new HttpClientV4Test().executeV4getTest(); } catch (Exception e) { e.printStackTrace(); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
HttpClient3と違いHttpClient4では自動で解凍していて
さらにレスポンスヘッダから削除しているようです。
(何故こんな余計な事をするのか)
WireSharkで見るとヘッダに残っていました。
自動で解凍をさせないようにするにはクライアントの生成時に
disableContentCompression()を指定します。

投稿2017/12/18 04:29

cima

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問