HttpURLConnectionを使用してHTTP通信を行う


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メソッドで本文取得用のストリームを取得しています。
このストリームを使用して、本文を取得します。

One Comment