Forskel mellem URL og URI

1. Oversigt

I denne korte artikel vil vi se på de vigtigste forskelle mellem URI'er og URL'er og implementere eksempler for at fremhæve disse forskelle.

2. URI og URL

Forskellen mellem dem er ligetil efter at have kendskab til deres definitioner:

  • Uniform Resource Identifier (URI) - en række af tegn, der tillader fuldstændig identifikation af enhver abstrakt eller fysisk ressource
  • Uniform Resource Locator (URL) - et undersæt af URI, der ud over at identificere, hvor en ressource er tilgængelig, beskriver den primære mekanisme til at få adgang til den

Nu kan vi konkludere, at hver URL er en URI, men det modsatte er ikke sandt, som vi vil se senere.

2.1. Syntaks

Hver URI, uanset om det er en URL eller ej, følger en bestemt form:

skema: [// autoritet] [/ sti] [? forespørgsel] [# fragment]

Hvor hver del er beskrevet som følger:

  • ordning - for URL'er er navnet på den protokol, der bruges til at få adgang til ressourcen, for andre URI'er er et navn, der refererer til en specifikation til tildeling af identifikatorer inden for den ordning
  • myndighed- en valgfri del bestående af brugergodkendelsesoplysninger, en vært og en valgfri port
  • sti - det tjener til at identificere en ressource inden for dens anvendelsesområde ordning og myndighed
  • forespørgsel - yderligere data, som sammen med sti, tjener til at identificere en ressource. For webadresser er dette forespørgselsstrengen
  • fragment - en valgfri identifikator til en bestemt del af ressourcen

For let at identificere, om en bestemt URI også er en URL, kan vi kontrollere dens skema. Hver URL skal starte med en af ​​disse ordninger: ftp, http, https,gopher, mailto, nyheder, nntp, telnet, wais, fil, eller fremgang. Hvis det ikke starter med det, er det ikke en URL.

Nu hvor vi kender syntaksen, lad os se på nogle eksempler. Her er en liste over URI'er, hvor kun de første tre er URL'er:

ftp://ftp.is.co.za/rfc/rfc1808.txt //tools.ietf.org/html/rfc3986 mailto: [email protected] tlf: + 1-816-555-1212 urn: oasis: navne: docbook: dtd: xml: 4.1 urn: isbn: 1234567890

3. URI og URL Java API forskelle

I dette afsnit demonstrerer vi med eksempler de største forskelle mellem URI og URL klasser leveret af Java.

3.1. Instantiering

Opretter URI og URL forekomster er meget ens, begge klasser giver flere konstruktører, der accepterer de fleste af dets dele, dog kun den URI klasse har en konstruktør til at specificere alle dele af syntaksen:

@Test offentlig ugyldigt nårCreatingURIs_thenSameInfo () kaster undtagelse {URI firstURI = ny URI ("somescheme: // theuser: [email protected]: 80" + "/ some / path? Thequery # somefragment"); URI secondURI = ny URI ("somescheme", "theuser: thepassword", "someuthority", 80, "/ some / path", "thequery", "somefragment"); assertEquals (firstURI.getScheme (), secondURI.getScheme ()); assertEquals (firstURI.getPath (), secondURI.getPath ()); } @Test offentlig ugyldigt nårCreatingURLs_thenSameInfo () kaster undtagelse {URL firstURL = ny URL ("// theuser: [email protected]: 80" + "/ path / to / file? The query # somefragment"); URL secondURL = ny URL ("http", "somehost", 80, "/ sti / til / fil"); assertEquals (firstURL.getHost (), secondURL.getHost ()); assertEquals (firstURL.getPath (), secondURL.getPath ()); }

Det URI klasse giver også en hjælpemetode til at oprette en ny forekomst, der ikke kaster en kontrolleret undtagelse:

@Test offentlig ugyldig nårCreatingURI_thenCorrect () {URI uri = URI.create ("urn: isbn: 1234567890"); assertNotNull (uri); }

Det URL klasse giver ikke en sådan metode.

Da en URL skal starte med en af ​​de tidligere nævnte ordninger, vil forsøg på at oprette et objekt med en anden resultere i en undtagelse:

@Test (forventet = MalformedURLException.class) offentlig ugyldig nårCreatingURLs_thenException () kaster Undtagelse {URL theURL = ny URL ("otherprotocol: // somehost / path / to / file"); assertNotNull (theURL); }

Der er andre konstruktører i begge klasser, se URI og URL-dokumentation for at finde dem alle.

3.2. Konvertering mellem URI- og URL-forekomster

Konvertering mellem URI og URL er ret ligetil:

@Test offentligt ugyldigt givetObjects_whenConverting_thenCorrect () kaster MalformedURLException, URISyntaxException {String aURIString = "// somehost: 80 / path? Thequery"; URI uri = ny URI (aURIString); URL url = ny URL (aURIString); URL toURL = uri.toURL (); URI toURI = url.toURI (); assertNotNull (url); assertNotNull (uri); assertEquals (toURL.toString (), toURI.toString ()); }

Forsøg på at konvertere en URI, der ikke er URL, resulterer imidlertid i en undtagelse:

@Test (forventet = MalformedURLException.class) offentlig ugyldighed givetURI_whenConvertingToURL_thenException () kaster MalformedURLException, URISyntaxException {URI uri = ny URI ("somescheme: // someauthority / path? The query"); URL url = uri.toURL (); assertNotNull (url); }

3.3. Åbning af en fjernforbindelse

Da en URL er en gyldig reference til en ekstern ressource, giver Java metoder til at åbne en forbindelse til den ressource og få dens indhold:

@Test offentlig ugyldighed givetURL_whenGettingContents_thenCorrect () kaster FejlformetURLException, IOException {URL url = ny URL ("// kurser.baeldung.com"); Strengindhold = IOUtils.toString (url.openStream ()); assertTrue (contents.contains ("")); }

4. Konklusion

I denne hurtige artikel præsenterede vi et par eksempler for at demonstrere forskellene mellem URI og URL i Java.

Vi fremhævede forskellene, når vi oprettede forekomster af begge objekter, og mens vi konverterede det ene objekt til det andet. Vi viste også, at en URL har metoder til at åbne en fjernforbindelse til den spidse ressource.

Som altid kan komplet kildekode til denne artikel findes på Github.