“Socketクラスを使用してソケット通信をする“では、ソケット通信でサーバーと通信する為の汎用的な方法を紹介しましたが、今回はHTTP通信に特化した、HttpURLConnectionクラスを使用して通信する方法を紹介します。
“DefaultHttpClientを使ってコンテンツを取得する“でもHTTP通信には触れましたが、今回紹介するHttpURLConnection
クラスはヘッダーの追加など、更に高度なHTTP通信の機能を提供してくれます。
詳細は以下から。
リクエストを送信する
ページ取得の為に、HTTP通信を開始し、リクエストをサーバーに送信します。
HttpURLConnection con = null;
// URLの作成
URL url = new URL("https://techbooster.org/");
// 接続用HttpURLConnectionオブジェクト作成
con = (HttpURLConnection)url.openConnection();
// リクエストメソッドの設定
con.setRequestMethod("GET");
// リダイレクトを自動で許可しない設定
con.setInstanceFollowRedirects(false);
// ヘッダーの設定(複数設定可能)
con.setRequestProperty("Accept-Language", "jp");
// 接続
con.connect();
4行目では通信相手のURLを指定して、URLクラスのオブジェクトを作成しています。
9行目ではHttpURLConnection#setRequestMethodメソッドを使用して、リクエストメソッドをGETに指定しています。
ここではGETの他に、POSTを指定することもできます。POSTを指定する場合は、HttpURLConnection#setDoOutputメソッドで引数にtrueを設定する必要があります。
11行目ではHttpURLConnection#setInstanceFollowRedirectsメソッドでリダイレクトに自動で従うかどうかを指定します。
このメソッドの引数にtrueを設定するとリダイレクトに自動で従い、falseに設定すると自動で従わなくなります。
13行目ではHttpURLConnection#setRequestPropertyメソッドでリクエストヘッダを設定しています。
このメソッドの第一引数に設定したいヘッダ名を、第二引数にヘッダに指定する値を設定します。
16行目ではHttpURLConnection#connectメソッドで接続を開始しています。このメソッドが実行された時点で、サーバーからレスポンスが返ってきます。
ヘッダを取得する
サーバーから受信したメッセージのヘッダー部分を取得します。
Map headers = con.getHeaderFields();
Iterator headerIt = headers.keySet().iterator();
String header = null;
while(headerIt.hasNext()){
String headerKey = (String)headerIt.next();
header += headerKey + ":" + headers.get(headerKey) + "\r\n";
}
1行目ではHttpURLConnection#getHeaderFieldsメソッドでヘッダーを取得しています。このメソッドではMap型のオブジェクトとしてヘッダーが取得できます。
2〜7行目ではIteratorを使用してヘッダーとヘッダーの値をMapオブジェクトから取得しています。
本文を取得する
サーバーから受信したメッセージの本文であるBODY部を取得します。このBODY部をWEBブラウザなどで開くと、WEBページが表示されます。
// 本文の取得 InputStream in = con.getInputStream(); byte bodyByte[] = new byte[1024]; in.read(bodyByte); in.close();
2行目ではHttpURLConnection#getInputStreamメソッドで本文取得用のストリームを取得しています。
このストリームを使用して、本文を取得します。