Différence entre URL et URI

Différence entre URL et URI

1. Vue d'ensemble

Dans ce court article, nous allons examiner les principales différences entre les URI et les URL et mettre en œuvre des exemples pour mettre en évidence ces différences.

2. URI et URL

La différence entre eux est simple après avoir connu leurs définitions:

  • Uniform Resource Identifier (URI) - une séquence de caractères qui permet l'identification complète de toute ressource abstraite ou physique

  • Uniform Resource Locator (URL) - un sous-ensemble d'URI qui, en plus d'identifier où une ressource est disponible, décrit le mécanisme principal pour y accéder

Now we can conclude that every URL is a URI, mais l’inverse n’est pas vrai, comme nous le verrons plus tard.

2.1. Syntaxe

Chaque URI, qu'il s'agisse d'une URL ou non, suit une forme particulière:

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

Où chaque partie est décrite comme suit:

  • scheme - pour les URL, est le nom du protocole utilisé pour accéder à la ressource, pour les autres URI, est un nom qui fait référence à une spécification pour l'attribution d'identificateurs dans ce schéma

  • authority - une partie facultative comprenant des informations d'authentification utilisateur, un hôte et un port facultatif

  • path - il sert à identifier une ressource dans la portée de sesscheme etauthority

  • query - données supplémentaires qui, avec lespath,, servent à identifier une ressource. Pour les URL, il s'agit de la chaîne de requête

  • fragment - un identifiant facultatif pour une partie spécifique de la ressource

To easily identify if a particular URI is also a URL, we can check its scheme. Chaque URL doit commencer par l'un de ces schémas:ftp,http,https,gopher,mailto,news,nntp,telnet,wais,file ouprospero. S'il ne commence pas par lui, ce n'est pas une URL.

Maintenant que nous connaissons la syntaxe, examinons quelques exemples. Voici une liste d'URI, où seules les trois premières sont des URL:

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. Différences entre les API Java URI et URL

Dans cette section, nous allons montrer avec des exemples les principales différences entre les classesURI etURL fournies par Java.

3.1. Instanciation

La création des instancesURI etURL est très similaire, les deux classes fournissent plusieurs constructeurs qui acceptent la plupart de ses parties, cependant, seule la classeURI a un constructeur pour spécifier toutes les parties de la syntaxe:

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

La classeURI fournit également une méthode utilitaire pour créer une nouvelle instance qui ne lève pas d'exception vérifiée:

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

    assertNotNull(uri);
}

La classeURL ne fournit pas une telle méthode.

Dans la mesure où une URL doit commencer par l'un des schémas mentionnés précédemment, toute tentative de création d'un objet avec un autre entraînera une exception:

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

    assertNotNull(theURL);
}

Il existe d'autres constructeurs dans les deux classes, pour les découvrir tous, veuillez vous référer à la documentation deURI etURL.

3.2. Conversion entre les instances d'URI et d'URL

La conversion entre URI et URL est assez simple:

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

Cependant, essayer de convertir un URI non-URL donne lieu à une exception:

@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. Ouverture d'une connexion à distance

Puisqu'une URL est une référence valide vers une ressource distante, Java fournit des méthodes pour ouvrir une connexion à cette ressource et obtenir son contenu:

@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. Conclusion

Dans cet article rapide, nous avons présenté quelques exemples pour démontrer les différences entreURI etURL en Java.

Nous avons mis en évidence les différences lors de la création d'instances des deux objets et lors de la conversion d'un objet en un autre. Nous avons également montré que aURL a des méthodes pour ouvrir une connexion distante à la ressource pointée.

Comme toujours, le code source complet de cet article peut être trouvéover on Github.