Différence entre URL et URI

1. Vue d'ensemble

Dans ce court article, nous examinerons les principales différences entre les URI et les URL et implémenterons 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

Maintenant, nous pouvons conclure que chaque URL est un 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:

  • schéma - 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'identifiants dans ce schéma
  • autorité - une partie facultative comprenant les informations d'authentification de l'utilisateur, un hôte et un port facultatif
  • chemin - il sert à identifier une ressource dans le cadre de son schéma etde son autorité
  • requête - données supplémentaires qui, avec le chemin, 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

Pour identifier facilement si un URI particulier est également une URL, nous pouvons vérifier son schéma . Chaque URL doit commencer par l'un de ces schémas: ftp , http , https, gopher , mailto , news , nntp , telnet , wais , file ou Prospero . Si cela ne commence pas par lui, ce n'est pas une URL.

Maintenant que nous connaissons la syntaxe, regardons quelques exemples. Voici une liste d'URI, où seuls les trois premiers sont des URL:

ftp://ftp.is.co.za/rfc/rfc1808.txt //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 démontrerons avec des exemples les principales différences entre les classes URI et URL fournies par Java.

3.1. Instanciation

La création d' instances d' URI et d' URL est très similaire, les deux classes fournissent plusieurs constructeurs qui acceptent la plupart de ses parties, cependant, seule la classe URI 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( "//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 classe URI 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 classe URL ne fournit pas une telle méthode.

Puisqu'une URL doit commencer par l'un des schémas mentionnés précédemment, essayer de créer 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 URI et URL.

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 = "//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 entraîne 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 à 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("//courses.baeldung.com"); String contents = IOUtils.toString(url.openStream()); assertTrue(contents.contains("")); }

4. Conclusion

Dans cet article rapide, nous avons présenté quelques exemples pour illustrer les différences entre URI et URL 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 à l'autre. Nous avons également montré qu'une URL a des méthodes pour ouvrir une connexion à distance à la ressource pointée.

Comme toujours, le code source complet de cet article est disponible sur Github.