ネットワーク接続: URL と URLConnection

Java で インターネット上のリソースを利用するには、
class URL と class URLConnection を用います。

# class URL

URL(Uniform Resource Locator) を表すクラスです。
URL はインターネット上のリソースの位置を表すものです。

コンストラクタ URL(String url)
指定された文字列のURLを生成
文字列がURLとして不適切であったり、サポートしていないプロトコルが指定されていたりすると、例外 MalformedURLException が発生
コンストラクタ URL(URL context, String spec)
指定されたURL context を元となる URL として、
相対パスや / で始まる絶対パスなどの文字列 spec から新たなURLを生成
メソッド URLConnection openConnection()
URLで表現されたリソースに接続するためのクラスURLConnection(後述)を返す。
場合によっては入出力例外 IOException が発生。
メソッド String toString()
この URL の文字列表現を返す。

→ その他のコンストラクタ/メソッド(リファレンス)

## URL エンコード

URL に使える文字は限られており、英数字以外には「.」「-」「*」「_」しか使えません。
これら以外の文字、例えば空白や全角文字を使いたいときには、
URLエンコード と呼ばれる方法を用います。

Java では URLEncoder クラスの encode メソッドで URLエンコードをすることができます。

クラスメソッド String encode(String s, String enc)
文字コード enc を使って文字列 s を URLエンコードした文字列を返す。
(文字コードは通常 utf-8 を用いるが、サーバに正しく伝わらない場合は euc-jp, shift_jis を試してみるとよい)

// エンコード前: https://www.google.com/search?q=東京電機大学
URL url = new URL("https://www.google.com/search?q=" + URLEncoder.encode("東京電機大学", "UTF-8"));
// エンコード後: https://www.google.com/search?q=%E6%9D%B1%E4%BA%AC%E9%9B%BB%E6%A9%9F%E5%A4%A7%E5%AD%A6

# class URLConnection

URLが表す特定のサーバとの接続を表す抽象クラスです。
このオブジェクトは上記 URL クラスの openConnection() メソッドにより得られます。

URL url = new URL("http://www.w3.org/");
URLConnection connection = url.openConnection();

メソッド void connect()
リソースの存在するサーバに実際に接続する。
接続する際のパラメータはこのメソッドを実行する前にセットしておくこと。
メソッド InputStream getInputStream()
このメソッドで、この通信の Stream を得ることができる。
ファイルと同様、これを Reader で読めばいい。
メソッド String getContentType()
リソースの種類を得る。Webページ(HTML文書)なのか画像なのか、といった判別をすることができる。
メソッド String getContentEncoding()
リソースの文字コードを得る。
サーバ側でこの情報を出さないことが多いため、機能しないことが多い。

→ その他のコンストラクタ/メソッド(リファレンス)

HTTP接続をする場合、実際には
HttpURLConnection
のインスタンスであるので、
HTTP接続固有の情報を参照したい場合には HttpURLConnection でキャストして使うことになります。

URL url = new URL("http://www.w3.org/");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
// ブラウザ (User-Agent)
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6");
// リンク元 (Referer)
connection.setRequestProperty("Referer", "http://www.google.com/");
// リダイレクトの指示を無視
connection.setInstanceFollowRedirects(false);

より詳細なヘッダの情報や、ステータスコード、リダイレクトなどを扱うことができます。

→ メソッド(リファレンス)

# Cookie の扱い

セッション管理や履歴の保存などで Cookie が使われることがあります。
Cookie の管理を自前でやるのは煩雑なことですが、
それを暗黙のうちに行ってくれるクラス
java.net.CookieHandler があります。
なお、java.net.CookieHandler は抽象クラスで、
java.net.CookieManager が具象クラスです。

// CookieManager の生成
CookieManager manager = new CookieManager();
// CookieHandler のデフォルトに設定
CookieHandler.setDefault(manager);

こうしておくと、HttpURLConnection が自動的に CookieHandler を呼び出すので、Cookie の保存などの処理が暗黙のうちに行われるようになります。

→ java.net.CookieManager (リファレンス)