Perbezaan antara URL dan URI

1. Gambaran keseluruhan

Dalam artikel pendek ini, kita akan melihat perbezaan utama antara URI dan URL dan menerapkan contoh untuk menyoroti perbezaan tersebut.

2. URI dan URL

Perbezaan antara keduanya langsung setelah mengetahui definisi mereka:

  • Uniform Resource Identifier (URI) - urutan watak yang membolehkan pengenalan lengkap sumber abstrak atau fizikal
  • Uniform Resource Locator (URL) - subset URI yang, selain mengenal pasti tempat sumber tersedia, menerangkan mekanisme utama untuk mengaksesnya

Sekarang kita dapat menyimpulkan bahawa setiap URL adalah URI , tetapi sebaliknya tidak benar, seperti yang akan kita lihat kemudian.

2.1. Sintaks

Setiap URI, tidak kira sama ada URL atau tidak, mengikuti borang tertentu:

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

Di mana setiap bahagian dijelaskan seperti berikut:

  • skema - untuk URL, adalah nama protokol yang digunakan untuk mengakses sumber, untuk URI lain, adalah nama yang merujuk kepada spesifikasi untuk menetapkan pengenal dalam skema itu
  • autoriti - bahagian pilihan yang terdiri daripada maklumat pengesahan pengguna, hos dan port pilihan
  • jalan - berfungsi untuk mengenal pasti sumber yang berada dalam skop skim dan kewibawaannya
  • pertanyaan - data tambahan yang, bersama dengan jalan, berfungsi untuk mengenal pasti sumber. Untuk URL, ini adalah rentetan pertanyaan
  • fragmen - pengecam pilihan untuk bahagian sumber tertentu

Untuk mengenal pasti dengan mudah jika URI tertentu juga merupakan URL, kita dapat memeriksa skema . Setiap URL mempunyai untuk memulakan dengan mana-mana skim ini: ftp , http , https, gopher , mailto , berita , nntp , telnet , WAIS , fail , atau prospero . Sekiranya tidak bermula dengannya, itu bukan URL.

Sekarang kita mengetahui sintaksnya, mari kita lihat beberapa contoh. Berikut adalah senarai URI, di mana hanya tiga yang pertama adalah 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. Perbezaan API Java URI dan URL

Di bahagian ini, kami akan menunjukkan dengan contoh perbezaan utama antara kelas URI dan URL yang disediakan oleh Java.

3.1. Instantiasi

Membuat contoh URI dan URL sangat serupa, kedua-dua kelas menyediakan beberapa pembina yang menerima sebahagian besar bahagiannya, namun, hanya kelas URI yang mempunyai konstruktor untuk menentukan semua bahagian sintaks:

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

The URI kelas juga menyediakan kaedah utiliti untuk mewujudkan contoh baru yang tidak membuang pengecualian yang disemak:

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

The URL kelas tidak menyediakan kaedah itu.

Oleh kerana URL harus bermula dengan salah satu skema yang telah disebutkan sebelumnya, cuba membuat objek dengan yang lain akan menghasilkan pengecualian:

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

Terdapat pembina lain di kedua-dua kelas tersebut, untuk mengetahui semuanya, sila rujuk dokumentasi URI dan URL.

3.2. Menukar Antara URI dan Contoh URL

Penukaran antara URI dan URL cukup mudah:

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

Walau bagaimanapun, cuba menukar URI bukan URL menghasilkan pengecualian:

@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. Membuka Sambungan Jauh

Oleh kerana URL adalah rujukan yang sah ke sumber jauh, Java menyediakan kaedah untuk membuka sambungan ke sumber tersebut dan mendapatkan isinya:

@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. Kesimpulan

Dalam artikel ringkas ini, kami menyajikan beberapa contoh untuk menunjukkan perbezaan antara URI dan URL di Java.

Kami menyoroti perbezaan ketika membuat kejadian kedua-dua objek dan semasa menukar satu objek ke objek lain. Kami juga menunjukkan bahawa URL mempunyai kaedah untuk membuka sambungan jauh ke sumber runcing.

Seperti biasa, kod sumber lengkap untuk artikel ini boleh didapati di Github.