Differenza tra URL e URI

1. Panoramica

In questo breve articolo, daremo uno sguardo alle principali differenze tra URI e URL e implementeremo esempi per evidenziare tali differenze.

2. URI e URL

La differenza tra loro è chiara dopo aver conosciuto le loro definizioni:

  • Uniform Resource Identifier (URI) : una sequenza di caratteri che consente l'identificazione completa di qualsiasi risorsa fisica o astratta
  • Uniform Resource Locator (URL) : un sottoinsieme di URI che, oltre a identificare dove è disponibile una risorsa, descrive il meccanismo principale per accedervi

Ora possiamo concludere che ogni URL è un URI , ma non è vero il contrario, come vedremo più avanti.

2.1. Sintassi

Ogni URI, indipendentemente dal fatto che sia un URL o meno, segue una forma particolare:

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

Dove ogni parte è descritta come segue:

  • schema : per gli URL, è il nome del protocollo utilizzato per accedere alla risorsa, per altri URI è un nome che si riferisce a una specifica per l'assegnazione di identificatori all'interno di quello schema
  • autorità : una parte facoltativa composta dalle informazioni di autenticazione dell'utente, un host e una porta opzionale
  • percorso : serve a identificare una risorsa nell'ambito del suo schema e autorità
  • query : dati aggiuntivi che, insieme al percorso, servono a identificare una risorsa. Per gli URL, questa è la stringa della query
  • frammento : un identificatore facoltativo per una parte specifica della risorsa

Per identificare facilmente se un particolare URI è anche un URL, possiamo controllare il suo schema . Ogni URL deve iniziare con uno qualsiasi di questi schemi: ftp , http , https, gopher , mailto , news , nntp , telnet , wais , file o prospero . Se non inizia con esso, non è un URL.

Ora che conosciamo la sintassi, diamo un'occhiata ad alcuni esempi. Ecco un elenco di URI, dove solo i primi tre sono 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. Differenze tra URI e URL API Java

In questa sezione, dimostreremo con esempi le principali differenze tra le classi URI e URL fornite da Java.

3.1. Istanziazione

La creazione di istanze URI e URL è molto simile, entrambe le classi forniscono diversi costruttori che accettano la maggior parte delle sue parti, tuttavia, solo la classe URI ha un costruttore per specificare tutte le parti della sintassi:

@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 fornisce anche un metodo di utilità per creare una nuova istanza che non genera un'eccezione controllata:

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

La classe URL non fornisce tale metodo.

Poiché un URL deve iniziare con uno degli schemi menzionati in precedenza, provare a creare un oggetto con uno diverso risulterà in un'eccezione:

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

Ci sono altri costruttori in entrambe le classi, per scoprirli tutti, fare riferimento alla documentazione URI e URL.

3.2. Conversione tra istanze URI e URL

La conversione tra URI e URL è piuttosto semplice:

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

Tuttavia, il tentativo di convertire un URI non URL genera un'eccezione:

@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. Apertura di una connessione remota

Poiché un URL è un riferimento valido a una risorsa remota, Java fornisce metodi per aprire una connessione a quella risorsa e ottenerne il contenuto:

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

In questo breve articolo, abbiamo presentato alcuni esempi per dimostrare le differenze tra URI e URL in Java.

Abbiamo evidenziato le differenze durante la creazione di istanze di entrambi gli oggetti e durante la conversione di un oggetto in un altro. Abbiamo anche mostrato che un URL ha metodi per aprire una connessione remota alla risorsa puntata.

Come sempre, il codice sorgente completo per questo articolo può essere trovato su Github.