Perbedaan antara URL dan URI

1. Ikhtisar

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

2. URI dan URL

Perbedaan di antara keduanya langsung terlihat setelah mengetahui definisinya:

  • Uniform Resource Identifier (URI) - urutan karakter yang memungkinkan identifikasi lengkap dari sumber daya abstrak atau fisik
  • Uniform Resource Locator (URL) - subset URI yang, selain mengidentifikasi di mana sumber daya tersedia, menjelaskan mekanisme utama untuk mengaksesnya

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

2.1. Sintaksis

Setiap URI, terlepas dari apakah itu URL atau bukan, mengikuti bentuk tertentu:

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

Dimana setiap bagian dijelaskan sebagai berikut:

  • skema - untuk URL, adalah nama protokol yang digunakan untuk mengakses sumber daya, untuk URI lain, adalah nama yang merujuk ke spesifikasi untuk menetapkan pengidentifikasi dalam skema itu
  • otoritas - bagian opsional yang terdiri dari informasi otentikasi pengguna, host dan port opsional
  • path - berfungsi untuk mengidentifikasi sumber daya dalam lingkup skema dan otoritasnya
  • query - data tambahan yang, bersama dengan jalur, berfungsi untuk mengidentifikasi sumber daya. Untuk URL, ini adalah string kueri
  • fragment - pengenal opsional ke bagian tertentu dari resource

Untuk dengan mudah mengidentifikasi apakah URI tertentu juga merupakan URL, kita dapat memeriksa skemanya . Setiap URL harus dimulai dengan salah satu skema berikut: ftp , http , https, gopher , mailto , news , nntp , telnet , wais , file , atau makmur . Jika tidak dimulai dengan itu, maka itu bukan URL.

Sekarang setelah kita mengetahui sintaksnya, mari kita lihat beberapa contoh. Berikut adalah daftar URI, dengan 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. Perbedaan URI dan URL Java API

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

3.1. Instansiasi

Membuat instance URI dan URL sangat mirip, kedua kelas menyediakan beberapa konstruktor yang menerima sebagian besar bagiannya, namun, hanya kelas URI yang memiliki konstruktor untuk menentukan semua bagian 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()); }

Kelas URI juga menyediakan metode utilitas untuk membuat instance baru yang tidak menampilkan pengecualian yang dicentang:

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

Kelas URL tidak menyediakan metode seperti itu.

Karena URL harus dimulai dengan salah satu skema yang disebutkan sebelumnya, mencoba membuat objek dengan yang berbeda akan menghasilkan pengecualian:

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

Ada konstruktor lain di kedua kelas, untuk menemukan semuanya, lihat dokumentasi URI dan URL.

3.2. Mengonversi Antara URI dan Contoh URL

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

Namun, mencoba mengonversi URI non-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 Koneksi Jarak Jauh

Karena URL adalah referensi yang valid ke sumber daya jarak jauh, Java menyediakan metode untuk membuka koneksi ke sumber daya itu 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 singkat ini, kami menyajikan beberapa contoh untuk menunjukkan perbedaan antara URI dan URL di Java.

Kami menyoroti perbedaan saat membuat instance dari kedua objek dan saat mengonversi satu objek ke objek lainnya. Kami juga menunjukkan bahwa URL memiliki metode untuk membuka koneksi jarak jauh ke sumber daya yang diarahkan.

Seperti biasa, kode sumber lengkap untuk artikel ini dapat ditemukan di Github.