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