ネットワーク接続: URI, URL, URLConnection

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

class URI, URL

URL (Uniform Resource Locator) はインターネット上のリソースの位置を表すものです。 リソースの識別子である URI (Uniform Resource Identifier) の一種です。

Java で URL を扱う際には、URL を表す class URL を使います。 class URL のインスタンスは、class URI のインスタンスを生成して変換することにより得られます。

    URL url = new URI("http://www.w3.org/").toURL();

class URI

コンストラクタ URI(String url)
指定された文字列を解析してURIを構築
文字列がURIとして不適切であると、例外 URISyntaxException が発生
メソッド URL toURL()
この URI から URLを構築
URLとして不適切であったり、サポートしていないプロトコルが指定されていたりすると、例外 MalformedURLException が発生

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

class URL

URL(Uniform Resource Locator) を表すクラスです。 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 URI("http://www.w3.org/").toURL();
    URLConnection connection = url.openConnection();
メソッド void connect()
リソースの存在するサーバに実際に接続する。 接続する際のパラメータはこのメソッドを実行する前にセットしておくこと。
メソッド InputStream getInputStream()
このメソッドで、この通信の Stream を得ることができる。 ファイルと同様、これを Reader で読めばいい。
メソッド String getContentType()
リソースの種類を得る。Webページ(HTML文書)なのか画像なのか、といった判別をすることができる。
メソッド String getContentEncoding()
リソースの文字コードを得る。 サーバ側でこの情報を出さないことが多いため、機能しないことが多い。

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

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

    URL url = new URI("http://www.w3.org/").toURL();
    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 (リファレンス)