HttpURLConnectionを使用してHTTP通信を行う
|“Socketクラスを使用してソケット通信をする“では、ソケット通信でサーバーと通信する為の汎用的な方法を紹介しましたが、今回はHTTP通信に特化した、HttpURLConnectionクラスを使用して通信する方法を紹介します。
“DefaultHttpClientを使ってコンテンツを取得する“でもHTTP通信には触れましたが、今回紹介するHttpURLConnection
クラスはヘッダーの追加など、更に高度なHTTP通信の機能を提供してくれます。
詳細は以下から。
リクエストを送信する
ページ取得の為に、HTTP通信を開始し、リクエストをサーバーに送信します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | HttpURLConnection con = null ; // URLの作成 // 接続用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メソッドで接続を開始しています。このメソッドが実行された時点で、サーバーからレスポンスが返ってきます。
ヘッダを取得する
サーバーから受信したメッセージのヘッダー部分を取得します。
1 2 3 4 5 6 7 | 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ページが表示されます。
1 2 3 4 5 | // 本文の取得 InputStream in = con.getInputStream(); byte bodyByte[] = new byte [ 1024 ]; in.read(bodyByte); in.close(); |
2行目ではHttpURLConnection#getInputStreamメソッドで本文取得用のストリームを取得しています。
このストリームを使用して、本文を取得します。