Razlika između URL-a i URI-ja

1. Pregled

U ovom ćemo kratkom članku pogledati glavne razlike između URI-ja i URL-ova i primijeniti primjere kako bismo istaknuli te razlike.

2. URI i URL

Razlika između njih je jasna nakon poznavanja njihovih definicija:

  • Jedinstveni identifikator resursa (URI) - niz znakova koji omogućuje potpunu identifikaciju bilo kojeg apstraktnog ili fizičkog resursa
  • Jedinstveni lokator resursa (URL) - podskup URI-ja koji, osim što identificira gdje je resurs dostupan, opisuje primarni mehanizam za pristup

Sada možemo zaključiti da je svaki URL URI, ali suprotno nije istina, kao što ćemo vidjeti kasnije.

2.1. Sintaksa

Svaki URI, bez obzira je li to URL ili ne, slijedi određeni obrazac:

shema: [// autoritet] [/ put] [? upit] [# fragment]

Gdje je svaki dio opisan na sljedeći način:

  • shema - za URL-ove, naziv je protokola koji se koristi za pristup resursu, za ostale URI-je naziv koji se odnosi na specifikaciju za dodjelu identifikatora unutar te sheme
  • autoritet- neobavezni dio koji se sastoji od informacija o autentifikaciji korisnika, hosta i opcionalnog porta
  • staza - služi za identificiranje resursa u okviru njegovog shema i autoritet
  • upit - dodatni podaci koji, zajedno s staza, služi za identificiranje resursa. Za URL-ove ovo je niz upita
  • fragment - neobavezni identifikator za određeni dio resursa

Da bismo lako prepoznali je li određeni URI također URL, možemo provjeriti njegovu shemu. Svaki URL mora započeti s bilo kojom od ovih shema: ftp, http, https,gopher, mailto, vijesti, nntp, telnet, wais, datoteka, ili prospero. Ako ne započinje s tim, onda to nije URL.

Sad kad znamo sintaksu, pogledajmo neke primjere. Evo popisa URI-a, gdje su samo prva tri URL-ovi:

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 i URL Java API razlike

U ovom ćemo odjeljku na primjerima pokazati glavne razlike između URI i URL klase koje pruža Java.

3.1. Instanciranje

Stvaranje URI i URL slučajevi su vrlo slični, obje klase pružaju nekoliko konstruktora koji prihvaćaju većinu njegovih dijelova, međutim, samo URI klasa ima konstruktor za specificiranje svih dijelova sintakse:

@Test public void whenCreatingURIs_thenSameInfo () baca izuzetak {URI firstURI = novi URI ("somescheme: // theuser: [email protected]: 80" + "/ some / path? Thequery # somefragment"); URI secondURI = novi 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 () baca iznimku {URL firstURL = new URL ("// theuser: [email protected]: 80" + "/ path / to / file? Thequery # somefragment"); URL secondURL = novi URL ("http", "somehost", 80, "/ path / to / file"); assertEquals (firstURL.getHost (), secondURL.getHost ()); assertEquals (firstURL.getPath (), secondURL.getPath ()); }

The URI klasa također nudi uslužni metod za stvaranje nove instance koja ne dovodi provjerenu iznimku:

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

The URL klasa ne pruža takvu metodu.

Budući da URL mora započeti jednom od prethodno spomenutih shema, pokušaj stvaranja objekta s drugom rezultirat će iznimkom:

@Test (očekuje se = MalformedURLException.class) javna praznina kadaCreatingURLs_thenException () baca izuzetak {URL theURL = novi URL ("otherprotocol: // somehost / path / to / file"); assertNotNull (THEURL); }

U obje klase postoje i drugi konstruktori, da biste ih sve otkrili, pogledajte URI i URL dokumentaciju.

3.2. Pretvaranje između instanci URI-a i URL-a

Pretvorba između URI-a i URL-a prilično je jednostavna:

@Test javna praznina givenObjects_whenConverting_thenCorrect () baca MalformedURLException, URISyntaxException {String aURIString = "// somehost: 80 / path? Thequery"; URI uri = novi URI (aURIString); URL url = novi URL (aURIString); URL toURL = uri.toURL (); URI toURI = url.toURI (); assertNotNull (url); assertNotNull (uri); assertEquals (toURL.toString (), toURI.toString ()); }

Međutim, pokušaj pretvorbe URI-ja koji nije URL, rezultira iznimkom:

@Test (očekuje se = MalformedURLException.class) javna praznina givenURI_whenConvertingToURL_thenException () baca MalformedURLException, URISyntaxException {URI uri = novi URI ("somescheme: // someauthority / path? Thequery"); URL url = uri.toURL (); assertNotNull (url); }

3.3. Otvaranje daljinske veze

Budući da je URL važeća referenca na udaljeni resurs, Java nudi metode za otvaranje veze s tim resursom i dobivanje njegovog sadržaja:

@Test public void givenURL_whenGettingContents_thenCorrect () baca MalformedURLException, IOException {URL url = new URL ("// courses.baeldung.com"); Sadržaj niza = IOUtils.toString (url.openStream ()); assertTrue (contents.contens ("")); }

4. Zaključak

U ovom kratkom članku predstavili smo nekoliko primjera koji pokazuju razlike između URI i URL na Javi.

Istaknuli smo razlike prilikom stvaranja instanci oba objekta i tijekom pretvaranja jednog objekta u drugi. Također smo pokazali da a URL ima metode za otvaranje udaljene veze s istaknutim resursom.

Kao i uvijek, cjeloviti izvorni kod za ovaj članak nalazi se na Githubu.