Verschil tussen URL en URI

1. Overzicht

In dit korte artikel zullen we de belangrijkste verschillen tussen URI's en URL's bekijken en voorbeelden implementeren om die verschillen te benadrukken.

2. URI en URL

Het verschil tussen hen is duidelijk nadat ze hun definities kennen:

  • Uniform Resource Identifier (URI) - een reeks karakters die de volledige identificatie van elke abstracte of fysieke bron mogelijk maakt
  • Uniform Resource Locator (URL) - een subset van URI die, naast het identificeren van waar een bron beschikbaar is, het primaire mechanisme beschrijft om er toegang toe te krijgen

Nu kunnen we concluderen dat elke URL een URI is, maar het tegenovergestelde is niet waar, zoals we later zullen zien.

2.1. Syntaxis

Elke URI, ongeacht of het een URL is of niet, volgt een bepaalde vorm:

schema: [// autoriteit] [/ pad] [? vraag] [# fragment]

Waar elk onderdeel als volgt wordt beschreven:

  • regeling - voor URL's is dit de naam van het protocol dat wordt gebruikt om toegang te krijgen tot de bron, voor andere URI's is dit een naam die verwijst naar een specificatie voor het toewijzen van ID's binnen dat schema
  • Gezag- een optioneel onderdeel bestaande uit gebruikersauthenticatie-informatie, een host en een optionele poort
  • pad - het dient om een ​​bron te identificeren binnen de reikwijdte van zijn regeling en Gezag
  • vraag - aanvullende gegevens die, samen met de pad, dient om een ​​bron te identificeren. Voor URL's is dit de querytekenreeks
  • fragment - een optionele identificatie voor een specifiek deel van de bron

Om gemakkelijk te identificeren of een bepaalde URI ook een URL is, kunnen we het schema ervan controleren. Elke URL moet beginnen met een van deze schema's: ftp, http, https,gopher, mailto, nieuws, nntp, telnet, wais, het dossier, of prospero. Als het er niet mee begint, is het geen URL.

Nu we de syntaxis kennen, laten we enkele voorbeelden bekijken. Hier is een lijst met URI's, waarvan alleen de eerste drie URL's zijn:

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. URI en URL Java API-verschillen

In dit gedeelte demonstreren we met voorbeelden de belangrijkste verschillen tussen de URI en URL klassen geleverd door Java.

3.1. Instantiëring

Creëren URI en URL instanties lijken erg op elkaar, beide klassen bieden verschillende constructors die de meeste onderdelen accepteren, maar alleen de URI class heeft een constructor om alle delen van de syntaxis te specificeren:

@Test public void whenCreatingURIs_thenSameInfo () gooit uitzondering {URI firstURI = nieuwe URI ("somescheme: // theuser: [email protected]: 80" + "/ sommige / pad? Thequery # somefragment"); URI secondURI = nieuwe 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 () gooit uitzondering {URL firstURL = nieuwe URL ("// theuser: [email protected]: 80" + "/ pad / naar / bestand? Thequery # somefragment"); URL secondURL = nieuwe URL ("http", "een host", 80, "/ pad / naar / bestand"); assertEquals (firstURL.getHost (), secondURL.getHost ()); assertEquals (firstURL.getPath (), secondURL.getPath ()); }

De URI class biedt ook een hulpprogramma-methode om een ​​nieuwe instantie te maken die geen gecontroleerde uitzondering genereert:

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

De URL class biedt een dergelijke methode niet.

Omdat een URL moet beginnen met een van de eerder genoemde schema's, zal het proberen om een ​​object met een ander object te maken, resulteren in een uitzondering:

@Test (verwacht = MalformedURLException.class) public void whenCreatingURLs_thenException () genereert Uitzondering {URL theURL = nieuwe URL ("otherprotocol: // eenhost / pad / naar / bestand"); assertNotNull (theURL); }

Er zijn andere constructors in beide klassen, om ze allemaal te ontdekken, raadpleegt u de URI- en URL-documentatie.

3.2. Converteren tussen URI- en URL-instanties

Conversie tussen URI en URL is vrij eenvoudig:

@Test openbare leegte gegevenObjects_whenConverting_thenCorrect () gooit MalformedURLException, URISyntaxException {String aURIString = "// somehost: 80 / path? Thequery"; URI uri = nieuwe URI (aURIString); URL url = nieuwe URL (aURIString); URL toURL = uri.toURL (); URI toURI = url.toURI (); assertNotNull (url); assertNotNull (uri); assertEquals (toURL.toString (), toURI.toString ()); }

Als u echter een niet-URL-URI probeert te converteren, krijgt u een uitzondering:

@Test (verwacht = MalformedURLException.class) openbare leegte gegevenURI_whenConvertingToURL_thenException () gooit MalformedURLException, URISyntaxException {URI uri = nieuwe URI ("somescheme: // somautoriteit / pad? Thequery"); URL url = uri.toURL (); assertNotNull (url); }

3.3. Een externe verbinding openen

Aangezien een URL een geldige verwijzing is naar een externe bron, biedt Java methoden om een ​​verbinding met die bron te openen en de inhoud ervan te verkrijgen:

@Test openbare ongeldige gegevenURL_whenGettingContents_thenCorrect () gooit MalformedURLException, IOException {URL url = nieuwe URL ("// courses.baeldung.com"); String inhoud = IOUtils.toString (url.openStream ()); assertTrue (contents.contains ("")); }

4. Conclusie

In dit korte artikel hebben we een paar voorbeelden gepresenteerd om de verschillen tussen URI en URL in Java.

We hebben de verschillen benadrukt bij het maken van instanties van beide objecten en bij het converteren van het ene object naar het andere. We hebben ook aangetoond dat a URL heeft methoden om een ​​externe verbinding met de aangewezen bron te openen.

Zoals altijd is de volledige broncode voor dit artikel te vinden op Github.