1概要

この記事では、Javaネットワーク・プログラミングを使った低レベルの操作について探ります。

URLを詳しく見ていきます。

URLは、ネットワーク上のリソースへの参照またはアドレスです。簡単に言えば、ネットワークを介して通信するJavaコードは、

java.net.URL

クラスを使用してリソースのアドレスを表すことができます。

Javaプラットフォームには、

java.net

パッケージにまとめられた、組み込みのネットワークサポートが付属しています。

import java.net.** ;


2 URLを作成する

まず、コンストラクタを使用し、リソースの人間が読めるアドレスを表すStringを渡して、

java.net.URL

オブジェクトを作成しましょう。

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

これで、

絶対URLオブジェクト

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

相対URLを作成することもできます。 Baeldungのホームページを表すURLオブジェクトがあるとします。

URL home = new URL("https://baeldung.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("https://baeldung.com");
    URL relativeUrl = new URL(baseUrl, "a-guide-to-java-sockets");

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

ただし、相対URLがその構成部分で絶対URLであることが検出された場合、

baseURL

は無視されます。

@Test
public void givenAbsoluteUrl__whenIgnoresBaseUrl__thenCorrect() {
    URL baseUrl = new URL("https://baeldung.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つのスラッシュで区切られています。つまり、

://.

です。


Homepage




のようなURLがある場合は、区切り文字の前の部分

http、

がプロトコルIDで、後続の部分がリソース名

baeldung.com

です。


URL

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


3.1. プロトコル

  • プロトコル** を取得するには、

    getProtocol()

    メソッドを使用します。

@Test
public void givenUrl__whenCanIdentifyProtocol__thenCorrect(){
    URL url = new URL("https://baeldung.com");

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


3.2. ポート

  • ポート** を取得するには、

    getPort()

    メソッドを使用します。

@Test
public void givenUrl__whenGetsDefaultPort__thenCorrect(){
    URL url = new URL("https://baeldung.com");

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

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

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

これは明示的に定義されたポートがある例です。

@Test
public void givenUrl__whenGetsPort__thenCorrect(){
    URL url = new URL("https://baeldung.com:8090");

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


3.3. ザ・ホスト

  • ホスト** は、

    ://

    区切り文字の直後から始まり、ドメイン名の拡張子(この例では

    .com

    )で終わるリソース名の一部です。

ホスト名を取得するために

getHost()

メソッドを呼び出します。

@Test
public void givenUrl__whenCanGetHost__thenCorrect(){
    URL url = new URL("https://baeldung.com");

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


3.4. ファイル名

URL内のホスト名の後に続くものはすべて、リソースのファイル名と呼ばれます。パスとクエリの両方のパラメータを含めることも、ファイル名だけを含めることもできます。

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

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

BaeldungのURL __/articlesの下にjava 8の記事があるとします。topic = java

@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. パスパラメータ

私たちの場合は

/articles

である

path

パラメータだけを調べることもできます。

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

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


3.6. クエリパラメータ

同様に、__topic = javaである

クエリパラメータ

を調べることができます。

@Test
public void givenUrl__whenCanGetQueryParams__thenCorrect() {
    URL url = new URL("/articles?topic=java<em>&amp;version=8</em>");

    assertEquals("topic=java<em>&amp;version=8</em>", url.getQuery());
}


4構成部品でURLを作成する

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

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

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

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

この文脈におけるfilenameの意味を覚えておいてください、以下のテストはそれをより明確にするはずです:

@Test
public void givenUrlComponents__whenConstructsCompleteUrl__thenCorrect2() {
    String protocol = "http";
    String host = "baeldung.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 = "baeldung.com";
    int port = 9000;
    String file = "/guidelines.txt";
    URL url = new URL(protocol, host, port, file);

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


5結論

このチュートリアルでは、

URL

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

いつものように、記事の全ソースコードとすべてのコードスニペットはhttps://github.com/eugenp/tutorials/tree/master/core-java/src/main/java/com/baeldung/networkingにあります。[GitHubプロジェクト]