1. 概要

この記事では、Javaネットワークプログラミングを使用した低レベルの操作について説明します。 URLについて詳しく見ていきます。

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");

絶対URLオブジェクトを作成しました。 アドレスには、目的のリソースに到達するために必要なすべての部分が含まれています。

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

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

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

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

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

3. URLコンポーネント

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

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

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

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

3.1. プロトコル

プロトコルを取得するには– getProtocol()メソッドを使用します。

@Test
public void givenUrl_whenCanIdentifyProtocol_thenCorrect(){
    URL url = new URL("http://baeldung.com");
    
    assertEquals("http", url.getProtocol());
}

3.2. 港

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

@Test
public void givenUrl_whenGetsDefaultPort_thenCorrect(){
    URL url = new URL("http://baeldung.com");
    
    assertEquals(-1, url.getPort());
    assertEquals(80, url.getDefaultPort());
}

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

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

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

@Test
public void givenUrl_whenGetsPort_thenCorrect(){
    URL url = new URL("http://baeldung.com:8090");
    
    assertEquals(8090, url.getPort());
}

3.3. ザ・ホスト

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

getHost()メソッドを呼び出して、ホスト名を取得します。

@Test
public void givenUrl_whenCanGetHost_thenCorrect(){
    URL url = new URL("http://baeldung.com");
    
    assertEquals("baeldung.com", url.getHost());
}

3.4. ファイル名

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

@Test
public void givenUrl_whenCanGetFileName_thenCorrect1() {
    URL url = new URL("http://baeldung.com/guidelines.txt");
    
    assertEquals("/guidelines.txt", url.getFile());
}

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

@Test
public void givenUrl_whenCanGetFileName_thenCorrect2() {
    URL url = new URL("http://baeldung.com/articles?topic=java&version=8");
    
    assertEquals("/articles?topic=java&version=8", url.getFile());
}

3.5. パスパラメータ

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

@Test
public void givenUrl_whenCanGetPathParams_thenCorrect() {
    URL url = new URL("http://baeldung.com/articles?topic=java&version=8");
    
    assertEquals("/articles", url.getPath());
}

3.6. クエリパラメータ

同様に、私たちは検査することができますクエリパラメータこれは topic = java&version = 8

@Test
public void givenUrl_whenCanGetQueryParams_thenCorrect() {
    URL url = new URL("http://baeldung.com/articles?topic=java<em>&version=8</em>");
    
    assertEquals("topic=java<em>&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("http://baeldung.com/guidelines.txt", url.toString());
}

このコンテキストでのファイル名の意味を覚えておいてください。次のテストで明確になります。

@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("http://baeldung.com/articles?topic=java&version=8", 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でそれを使用してプログラムでネットワークリソースにアクセスする方法を示しました。

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