Diferencia entre URL y URI

1. Información general

En este breve artículo, analizaremos las principales diferencias entre URI y URL e implementaremos ejemplos para resaltar esas diferencias.

2. URI y URL

La diferencia entre ellos es sencilla después de conocer sus definiciones:

  • Identificador uniforme de recursos (URI) : una secuencia de caracteres que permite la identificación completa de cualquier recurso físico o abstracto
  • Localizador uniforme de recursos (URL) : un subconjunto de URI que, además de identificar dónde está disponible un recurso, describe el mecanismo principal para acceder a él.

Ahora podemos concluir que cada URL es una URI , pero lo contrario no es cierto, como veremos más adelante.

2.1. Sintaxis

Cada URI, independientemente de si es una URL o no, sigue una forma particular:

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

Donde cada parte se describe de la siguiente manera:

  • esquema : para URL, es el nombre del protocolo utilizado para acceder al recurso, para otros URI, es un nombre que se refiere a una especificación para asignar identificadores dentro de ese esquema
  • autoridad : una parte opcional compuesta por información de autenticación del usuario, un host y un puerto opcional
  • ruta : sirve para identificar un recurso dentro del alcance de su esquema y autoridad
  • consulta : datos adicionales que, junto con la ruta, sirven para identificar un recurso. Para las URL, esta es la cadena de consulta
  • fragmento : un identificador opcional de una parte específica del recurso

Para identificar fácilmente si una URI en particular también es una URL, podemos verificar su esquema . Cada URL debe comenzar con cualquiera de estos esquemas: ftp , http , https, gopher , mailto , news , nntp , telnet , wais , file o prospero . Si no comienza con él, entonces no es una URL.

Ahora que conocemos la sintaxis, veamos algunos ejemplos. Aquí hay una lista de URI, donde solo los tres primeros son 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. Diferencias de API de Java en URI y URL

En esta sección, demostraremos con ejemplos las principales diferencias entre las clases URI y URL proporcionadas por Java.

3.1. Instanciación

La creación de instancias de URI y URL es muy similar, ambas clases proporcionan varios constructores que aceptan la mayoría de sus partes, sin embargo, solo la clase URI tiene un constructor para especificar todas las partes de la sintaxis:

@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 clase URI también proporciona un método de utilidad para crear una nueva instancia que no lanza una excepción marcada:

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

La clase de URL no proporciona dicho método.

Dado que una URL debe comenzar con uno de los esquemas mencionados anteriormente, intentar crear un objeto con uno diferente resultará en una excepción:

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

Hay otros constructores en ambas clases, para descubrirlos todos, consulte la documentación de URI y URL.

3.2. Conversión entre instancias de URL y URI

La conversión entre URI y URL es bastante sencilla:

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

Sin embargo, intentar convertir un URI que no es una URL da como resultado una excepción:

@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. Abrir una conexión remota

Dado que una URL es una referencia válida a un recurso remoto, Java proporciona métodos para abrir una conexión a ese recurso y obtener su contenido:

@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. Conclusión

En este artículo rápido, presentamos algunos ejemplos para demostrar las diferencias entre URI y URL en Java.

Destacamos las diferencias al crear instancias de ambos objetos y al convertir un objeto en otro. También mostramos que una URL tiene métodos para abrir una conexión remota al recurso señalado.

Como siempre, el código fuente completo de este artículo se puede encontrar en Github.