JavaのURLへのガイド

Java URLのガイド

1. 概要

この記事では、Javaネットワークプログラミングを使用した低レベルの操作について説明します。 We’ll be taking a deeper look at URLs.

URLは、ネットワーク上のリソースへの参照またはアドレスです。 簡単に言うと、ネットワークを介して通信するJavaコードは、java.net.URLクラスを使用してリソースのアドレスを表すことができます。

Javaプラットフォームには、java.netパッケージにバンドルされた組み込みのネットワークサポートが付属しています。

import java.net.*;

2. URLの作成

まず、コンストラクターを使用してjava.net.URLオブジェクトを作成し、リソースの人間が読める形式のアドレスを表す文字列を渡します。

URL url = new URL("/a-guide-to-java-sockets");

absolute URL objectを作成しました。 アドレスには、目的のリソースに到達するために必要なすべての部分があります。

a relative URLを作成することもできます。例のホームページを表すURLオブジェクトがあると仮定します。

URL home = new URL("http://example.com");

次に、既知のリソースを指す新しいURLを作成しましょう。別のコンストラクターを使用します。このコンストラクターは、既存のURLとそのURLに関連するリソース名の両方を取ります。

URL url = new URL(home, "a-guide-to-java-sockets");

これで、homeを基準にして新しいURLオブジェクトurlが作成されました。したがって、相対URLはベースURLのコンテキスト内でのみ有効です。

これはテストで見ることができます:

@Test
public void givenBaseUrl_whenCreatesRelativeUrl_thenCorrect() {
    URL baseUrl = new URL("http://example.com");
    URL relativeUrl = new URL(baseUrl, "a-guide-to-java-sockets");

    assertEquals(
      "/a-guide-to-java-sockets",
      relativeUrl.toString());
}

ただし、相対URLがそのコンポーネント部分で絶対であることが検出された場合、baseURLは無視されます。

@Test
public void givenAbsoluteUrl_whenIgnoresBaseUrl_thenCorrect() {
    URL baseUrl = new URL("http://example.com");
    URL relativeUrl = new URL(
      baseUrl, "/a-guide-to-java-sockets");

    assertEquals(
      "/a-guide-to-java-sockets",
      relativeUrl.toString());
}

最後に、URL文字列のコンポーネント部分を取り込む別のコンストラクターを呼び出して、URLを作成できます。 これについては、URLコンポーネントについて説明した後、次のセクションで説明します。

3. URLコンポーネント

URLはいくつかのコンポーネントで構成されています。これについては、このセクションで説明します。

まず、プロトコル識別子とリソースの区切りを見てみましょう。これら2つのコンポーネントは、コロンとそれに続く2つのスラッシュで区切られています。 ://.

http://example.comのようなURLがある場合、区切り文字の前の部分であるhttp,はプロトコル識別子であり、次のURLはリソース名であるexample.comです。

URLオブジェクトが公開するAPIを見てみましょう。

3.1. プロトコル

the protocolを取得するには–getProtocol()メソッドを使用します。

@Test
public void givenUrl_whenCanIdentifyProtocol_thenCorrect(){
    URL url = new URL("http://example.com");

    assertEquals("http", url.getProtocol());
}

3.2. 港

the portを取得するには–getPort()メソッドを使用します。

@Test
public void givenUrl_whenGetsDefaultPort_thenCorrect(){
    URL url = new URL("http://example.com");

    assertEquals(-1, url.getPort());
    assertEquals(80, url.getDefaultPort());
}

このメソッドは、明示的に定義されたポートを取得することに注意してください。 ポートが明示的に定義されていない場合、-1を返します。

また、HTTP通信ではデフォルトでポート80が使用されるため、ポートは定義されていません。

明示的に定義されたポートがある例を次に示します。

@Test
public void givenUrl_whenGetsPort_thenCorrect(){
    URL url = new URL("http://example.com:8090");

    assertEquals(8090, url.getPort());
}

3.3. ザ・ホスト

The hostは、://区切り文字の直後で始まり、ドメイン名拡張子(この場合は.com)で終わるリソース名の一部です。

ホスト名を取得するためにgetHost()メソッドを呼び出します。

@Test
public void givenUrl_whenCanGetHost_thenCorrect(){
    URL url = new URL("http://example.com");

    assertEquals("example.com", url.getHost());
}

3.4. ファイル名

URLのホスト名の後に続くものはすべて、file name of the resourceと呼ばれます。 パスとクエリパラメータの両方、またはファイル名のみを含めることができます。

@Test
public void givenUrl_whenCanGetFileName_thenCorrect1() {
    URL url = new URL("/guidelines.txt");

    assertEquals("/guidelines.txt", url.getFile());
}

例にURL/articles?topic=java&version=8の下にjava8の記事があると仮定します。 ホスト名の後はすべてファイル名です:

@Test
public void givenUrl_whenCanGetFileName_thenCorrect2() {
    URL url = new URL(
      "/articles?topic=java&version=8");

    assertEquals("/articles?topic=java&version=8", url.getFile());
}

3.5. パスパラメータ

また、the pathパラメータのみを検査できます。この場合は/articlesです。

@Test
public void givenUrl_whenCanGetPathParams_thenCorrect() {
    URL url = new URL(
      "/articles?topic=java&version=8");

    assertEquals("/articles", url.getPath());
}

3.6. クエリパラメータ

同様に、topic=java&version=8であるthe query parametersを検査できます。

@Test
public void givenUrl_whenCanGetQueryParams_thenCorrect() {
    URL url = new URL("/articles?topic=java&version=8");

    assertEquals("topic=java&version=8", url.getQuery());
}

4. コンポーネントパーツを使用したURLの作成

さまざまなURLコンポーネントとリソースへの完全なアドレスを形成する場所について見てきたので、コンポーネント部分を渡すことでURLオブジェクトを作成する別の方法を見ることができます。

最初のコンストラクターは、プロトコル、ホスト名、およびファイル名をそれぞれ受け取ります。

@Test
public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect() {
    String protocol = "http";
    String host = "example.com";
    String file = "/guidelines.txt";
    URL url = new URL(protocol, host, file);

    assertEquals("/guidelines.txt", url.toString());
}

このコンテキストでのファイル名の意味を念頭に置いて、次のテストでそれを明確にする必要があります。

@Test
public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect2() {
    String protocol = "http";
    String host = "example.com";
    String file = "/articles?topic=java&version=8";
    URL url = new URL(protocol, host, file);

    assertEquals("/guidelines.txt", url.toString());
}

2番目のコンストラクターは、プロトコル、ホスト名、ポート番号、およびファイル名をそれぞれ受け取ります。

@Test
public void givenUrlComponentsWithPort_whenConstructsCompleteUrl_
  thenCorrect() {
    String protocol = "http";
    String host = "example.com";
    int port = 9000;
    String file = "/guidelines.txt";
    URL url = new URL(protocol, host, port, file);

    assertEquals(
      "http://example.com:9000/guidelines.txt", url.toString());
}

5. 結論

このチュートリアルでは、URLクラスについて説明し、Javaでそれを使用してプログラムでネットワークリソースにアクセスする方法を示しました。

いつものように、記事の完全なソースコードとすべてのコードスニペットはGitHub projectにあります。