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にあります。