URLとURIの違い
1概要
この短い記事では、URIとURLの主な違いを見て、それらの違いを強調するための例を実装します。
2 URIとURL
それらの違いは、それらの定義を知っていれば簡単です。
-
Uniform Resource Identifier(URI)
– その文字列
あらゆる抽象的または物理的リソースの完全な識別を可能にします
Uniform Resource Locator(URL)** – さらにURIのサブセット
リソースが利用可能な場所を特定するために、リソースにアクセスするための主要なメカニズムについて説明します。
-
これで、すべてのURLはURI ** であると結論付けることができますが、後で説明するように、その逆は当てはまりません。
2.1. 構文
すべてのURIは、それがURLであるかどうかにかかわらず、特定の形式に従います。
scheme:[//authority][/path][?query][#fragment]----
各部の説明は次のとおりです。
** __ ** scheme ** __ - URLの場合、アクセスするために使用されるプロトコルの名前です。
リソースは、他のURIの場合、次の仕様を参照する名前です。
そのスキーム内で識別子を割り当てる
** ** __authority__ ** - ユーザー認証からなるオプション部分
情報、ホスト、およびオプションのポート
** __ ** path ** __ - その範囲内でリソースを識別するのに役立ちます
__scheme__と__authority__
** __ ** query ** __ - __pathと一緒に__が使用する追加データ
リソースを識別します。 URLの場合、これはクエリ文字列です。
** __ ** fragment ** __ - の特定部分へのオプションの識別子
リソース
** 特定のURIがURLでもあるかどうかを簡単に識別するために、そのスキームをチェックすることができます** 。すべてのURLは、__ftp__、__http__、__https、__ __gopher__、__mails__、__news__、__nntp__、__wais__、__file__、または__prospero__のいずれかのスキームで始める必要があります。それで始まらない場合は、URLではありません。
構文がわかったので、いくつか例を見てみましょう。これがURIのリストです。最初の3つだけがURLです。
[source,text,gutter:,true]
ftp://ftp.is.co.za/rfc/rfc1808.txt
https://tools.ietf.org/html/rfc3986
email protected
tel:+1-816-555-1212
urn:oasis:names:docbook:dtd:xml:4.1
urn:isbn:1234567890
=== ** 3 URIとURLのJava APIの違い** このセクションでは、Javaが提供する__URI__クラスと__URL__クラスの主な違いを例を使って説明します。 ==== ** 3.1. インスタンス化** __URI__インスタンスと__URL__インスタンスの作成は非常に似ています。どちらのクラスもそのほとんどの部分を受け入れる複数のコンストラクタを提供しますが、構文のすべての部分を指定するコンストラクタがあるのは__URI__クラスだけです。 [source,java,gutter:,true]
@Test
public void whenCreatingURIs__thenSameInfo() throws Exception {
URI firstURI = new URI(
“somescheme://theuser:[email protected]:80”
+ “/some/path?thequery#somefragment”);
URI secondURI = new URI( "somescheme", "theuser:thepassword", "someuthority", 80, "/some/path", "thequery", "somefragment");
assertEquals(firstURI.getScheme(), secondURI.getScheme()); assertEquals(firstURI.getPath(), secondURI.getPath()); }
@Test
public void whenCreatingURLs__thenSameInfo() throws Exception {
URL firstURL = new URL(
“http://theuser:[email protected]:80”
+ “/path/to/file?thequery#somefragment”);
URL secondURL = new URL(“http”, “somehost”, 80, “/path/to/file”);
assertEquals(firstURL.getHost(), secondURL.getHost()); assertEquals(firstURL.getPath(), secondURL.getPath()); }
__URI__クラスは、チェック済み例外をスローしない新しいインスタンスを作成するためのユーティリティメソッドも提供します。 [source,java,gutter:,true]
@Test
public void whenCreatingURI__thenCorrect() {
URI uri = URI.create(“urn:isbn:1234567890”);
assertNotNull(uri); }
__URL__クラスはそのようなメソッドを提供しません。 URLは前述のスキームのいずれかで開始する必要があるため、別のスキームでオブジェクトを作成しようとすると例外が発生します。 [source,java,gutter:,true]
@Test(expected = MalformedURLException.class)
public void whenCreatingURLs__thenException() throws Exception {
URL theURL = new URL(“otherprotocol://somehost/path/to/file”);
assertNotNull(theURL); }
両方のクラスには他にもコンストラクタがあります。それらすべてを発見するには、https://docs.oracle.com/javase/8/docs/api/java/net/URI.html[URI]およびhttps://を参照してください。 docs.oracle.com/javase/8/docs/api/java/net/URL.html[URL]のドキュメント。 ==== ** 3.2. URIとURLインスタンス間の変換** URIとURLの間の変換はかなり簡単です。 [source,java,gutter:,true]
@Test
public void givenObjects
whenConverting
thenCorrect()
throws MalformedURLException, URISyntaxException {
String aURIString = “http://somehost:80/path?thequery”;
URI uri = new URI(aURIString);
URL url = new URL(aURIString);
URL toURL = uri.toURL(); URI toURI = url.toURI();
assertNotNull(url); assertNotNull(uri); assertEquals(toURL.toString(), toURI.toString()); }
ただし、URL以外のURIを変換しようとすると例外が発生します。 [source,java,gutter:,true]
@Test(expected = MalformedURLException.class)
public void givenURI
whenConvertingToURL
thenException()
throws MalformedURLException, URISyntaxException {
URI uri = new URI(“somescheme://someauthority/path?thequery”);
URL url = uri.toURL();
assertNotNull(url); }
==== ** 3.3. リモート接続を開く** URLはリモートリソースへの有効な参照であるため、Javaはそのリソースへの接続を開いてその内容を取得するためのメソッドを提供します。 [source,java,gutter:,true]
@Test
public void givenURL
whenGettingContents
thenCorrect()
throws MalformedURLException, IOException {
URL url = new URL(“http://courses.baeldung.com”);
String contents = IOUtils.toString(url.openStream());
assertTrue(contents.contains("<!DOCTYPE html>")); }
=== ** 4結論** この簡単な記事では、Javaにおける__URI__と__URL__の違いを示すためにいくつかの例を紹介しました。 両方のオブジェクトのインスタンスを作成するときと、一方のオブジェクトを他方のオブジェクトに変換するときの違いを強調しました。また、__URL__には、指示されたリソースへのリモート接続を開くためのメソッドがあることも示しました。 いつものように、この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java[over on Github]にあります。