Unterschied zwischen URL und URI

Unterschied zwischen URL und URI

1. Überblick

In diesem kurzen Artikel werden wir uns die Hauptunterschiede zwischen URIs und URLs ansehen und Beispiele implementieren, um diese Unterschiede hervorzuheben.

2. URI und URL

Der Unterschied zwischen ihnen ist unmittelbar nach Kenntnis ihrer Definitionen:

  • Uniform Resource Identifier (URI) - eine Folge von Zeichen, mit der jede abstrakte oder physische Ressource vollständig identifiziert werden kann

  • Uniform Resource Locator (URL) - eine Teilmenge der URI, die nicht nur identifiziert, wo eine Ressource verfügbar ist, sondern auch den primären Mechanismus für den Zugriff darauf beschreibt

Now we can conclude that every URL is a URI, aber das Gegenteil ist nicht der Fall, wie wir später sehen werden.

2.1. Syntax

Jeder URI, unabhängig davon, ob es sich um eine URL handelt oder nicht, folgt einem bestimmten Formular:

scheme:[//authority][/path][?query][#fragment]

Wobei jedes Teil wie folgt beschrieben wird:

  • scheme - für URLs ist der Name des Protokolls, das für den Zugriff auf die Ressource verwendet wird, für andere URIs ein Name, der auf eine Spezifikation zum Zuweisen von Bezeichnern innerhalb dieses Schemas verweist

  • authority - Ein optionaler Teil, der aus Benutzerauthentifizierungsinformationen, einem Host und einem optionalen Port besteht

  • path - dient dazu, eine Ressource im Rahmen ihrerscheme undauthority zu identifizieren

  • query - zusätzliche Daten, die zusammen mitpath, zur Identifizierung einer Ressource dienen. Bei URLs ist dies die Abfragezeichenfolge

  • fragment - eine optionale Kennung für einen bestimmten Teil der Ressource

To easily identify if a particular URI is also a URL, we can check its scheme. Jede URL muss mit einem dieser Schemata beginnen:ftp,http,https,gopher,mailto,news,nntp,telnet,wais,file oderprospero. Wenn es nicht damit beginnt, ist es keine URL.

Nachdem wir die Syntax kennen, schauen wir uns einige Beispiele an. Hier ist eine Liste von URIs, wobei nur die ersten drei URLs sind:

ftp://ftp.is.co.za/rfc/rfc1808.txt
https://tools.ietf.org/html/rfc3986
mailto:[email protected]

tel:+1-816-555-1212
urn:oasis:names:docbook:dtd:xml:4.1
urn:isbn:1234567890

3. Unterschiede zwischen URI und URL-Java-API

In diesem Abschnitt werden anhand von Beispielen die Hauptunterschiede zwischen den von Java bereitgestellten KlassenURI undURLgezeigt.

3.1. Instanziierung

Das Erstellen vonURI- undURL-Instanzen ist sehr ähnlich. Beide Klassen bieten mehrere Konstruktoren, die die meisten ihrer Teile akzeptieren. Nur dieURI-Klasse verfügt jedoch über einen Konstruktor, mit dem alle Teile der Syntax angegeben werden können:

@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());
}

Die KlasseURIbietet auch eine Dienstprogrammmethode zum Erstellen einer neuen Instanz, die keine aktivierte Ausnahme auslöst:

@Test
public void whenCreatingURI_thenCorrect() {
    URI uri = URI.create("urn:isbn:1234567890");

    assertNotNull(uri);
}

Die KlasseURLbietet keine solche Methode.

Da eine URL mit einem der oben genannten Schemata beginnen muss, führt der Versuch, ein Objekt mit einem anderen zu erstellen, zu einer Ausnahme:

@Test(expected = MalformedURLException.class)
public void whenCreatingURLs_thenException() throws Exception {
    URL theURL = new URL("otherprotocol://somehost/path/to/file");

    assertNotNull(theURL);
}

In beiden Klassen gibt es andere Konstruktoren. Um sie alle zu ermitteln, lesen Sie bitte die Dokumentation zuURI undURL.

3.2. Konvertieren zwischen URI- und URL-Instanzen

Die Konvertierung zwischen URI und URL ist ziemlich einfach:

@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());
}

Der Versuch, einen Nicht-URL-URI zu konvertieren, führt jedoch zu einer Ausnahme:

@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. Öffnen einer Remoteverbindung

Da eine URL ein gültiger Verweis auf eine ferne Ressource ist, bietet Java Methoden zum Herstellen einer Verbindung zu dieser Ressource und zum Abrufen ihres Inhalts:

@Test
public void givenURL_whenGettingContents_thenCorrect()
  throws MalformedURLException, IOException {
    URL url = new URL("http://courses.example.com");

    String contents = IOUtils.toString(url.openStream());

    assertTrue(contents.contains(""));
}

4. Fazit

In diesem kurzen Artikel haben wir einige Beispiele vorgestellt, um die Unterschiede zwischenURI undURL in Java zu demonstrieren.

Wir haben die Unterschiede beim Erstellen von Instanzen beider Objekte und beim Konvertieren eines Objekts in das andere hervorgehoben. Wir haben auch gezeigt, dass aURL Methoden zum Öffnen einer Remoteverbindung zur angegebenen Ressource enthält.

Wie immer finden Sie den vollständigen Quellcode für diesen Artikel inover on Github.