Разлика между URL и URI

1. Общ преглед

В тази кратка статия ще разгледаме основните разлики между URI и URL адресите и ще приложим примери, за да подчертаем тези разлики.

2. URI и URL

Разликата между тях е ясна, след като се знаят дефинициите им:

  • Унифициран идентификатор на ресурс (URI) - последователност от символи, която позволява пълната идентификация на абстрактни или физически ресурси
  • Унифициран локатор на ресурси (URL) - подмножество на URI, което, освен че идентифицира къде е наличен ресурс, описва основния механизъм за достъп до него

Сега можем да заключим, че всеки URL е URI , но обратното не е вярно, както ще видим по-късно.

2.1. Синтаксис

Всеки URI, независимо дали е URL или не, следва определен формуляр:

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

Когато всяка част е описана по следния начин:

  • схема - за URL адреси, е името на протокола, използван за достъп до ресурса, за други URI, е име, което се отнася до спецификация за присвояване на идентификатори в рамките на тази схема
  • орган - незадължителна част, състояща се от информация за удостоверяване на потребителя, хост и незадължителен порт
  • път - служи за идентифициране на ресурс в рамките на неговата схема и правомощия
  • заявка - допълнителни данни, които заедно с пътя служат за идентифициране на ресурс. За URL адресите това е низът на заявката
  • фрагмент - незадължителен идентификатор на определена част от ресурса

За да разпознаем лесно дали даден URI също е URL, можем да проверим неговата схема . Всеки URL трябва да започва с някоя от тези схеми: ftp , http , https, gopher , mailto , news , nntp , telnet , wais , file или prospero . Ако не започва с него, значи не е URL.

Сега, когато знаем синтаксиса, нека разгледаме някои примери. Ето списък с URI, където само първите три са 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. URI и URL разлики в API на Java

В този раздел ще демонстрираме с примери основните разлики между URI и URL класовете, предоставени от Java.

3.1. Инстанциране

Създаването на екземпляри на URI и URL е много подобно, и двата класа предоставят няколко конструктора, които приемат повечето от частите му, но само класът URI има конструктор, който да указва всички части на синтаксиса:

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

Класът URI също предоставя метод на помощна програма за създаване на нов екземпляр, който не извежда проверено изключение:

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

Класът URL не предоставя такъв метод.

Тъй като URL адресът трябва да започва с една от споменатите по-рано схеми, опитът да се създаде обект с различна ще доведе до изключение:

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

Има и други конструктори в двата класа, за да ги откриете всички, моля обърнете се към URI и URL документацията.

3.2. Преобразуване между екземпляри на URI и URL

Преобразуването между URI и URL е доста лесно:

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

Опитът за конвертиране на URI без URL обаче води до изключение:

@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. Отваряне на отдалечена връзка

Тъй като URL адресът е валидна препратка към отдалечен ресурс, Java предоставя методи за отваряне на връзка с този ресурс и получаване на съдържанието му:

@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. Заключение

В тази кратка статия представихме няколко примера, за да демонстрираме разликите между URI и URL в Java.

Ние подчертахме разликите при създаване на екземпляри на двата обекта и при конвертиране на единия обект в другия. Също така показахме, че URL адресът има методи за отваряне на отдалечена връзка към посочения ресурс.

Както винаги, пълният изходен код за тази статия може да бъде намерен в Github.