ההבדל בין URL ו- URI

1. סקירה כללית

במאמר קצר זה, נבחן את ההבדלים העיקריים בין כתובות ה- URI לבין כתובות ה- URL וניישם דוגמאות להדגשת ההבדלים הללו.

2. URI ו- URL

ההבדל ביניהם הוא פשוט לאחר ידיעת ההגדרות שלהם:

  • מזהה משאבים אחיד (URI) - רצף תווים המאפשר זיהוי מלא של כל משאב מופשט או פיזי
  • איתור משאבים אחיד (URL) - תת-קבוצה של URI, בנוסף לזיהוי היכן משאב זמין, מתארת ​​את המנגנון העיקרי לגישה אליו

כעת אנו יכולים להסיק שכל כתובת אתר היא URI, אך ההפך אינו נכון, כפי שנראה בהמשך.

2.1. תחביר

כל URI, לא משנה אם מדובר בכתובת אתר או לא, עוקב אחר צורה מסוימת:

סכמה: [// סמכות] [/ נתיב] [? שאילתה] [שבר אחד]

כאשר כל חלק מתואר כדלקמן:

  • תָכְנִית - עבור כתובות URL, הוא שם הפרוטוקול המשמש לגישה למשאב, עבור URIs אחרים, הוא שם המתייחס למפרט להקצאת מזהים בתוך אותה תוכנית.
  • רָשׁוּת- חלק אופציונלי המורכב ממידע אימות משתמשים, מארח ויציאה אופציונלית
  • נָתִיב - הוא משמש לזיהוי משאב במסגרתו תָכְנִית ו רָשׁוּת
  • שאילתא - נתונים נוספים, יחד עם נָתִיב, משמש לזיהוי משאב. עבור כתובות אתרים זו מחרוזת השאילתה
  • רסיס - מזהה אופציונלי לחלק ספציפי של המשאב

כדי לזהות בקלות אם URI מסוים הוא גם כתובת אתר, נוכל לבדוק את התוכנית שלו. כל כתובת אתר צריכה להתחיל בכל אחת מהתוכניות הבאות: ftp, http, https,סְנָאִי הָעַרָבָה, mailto, חֲדָשׁוֹת, nntp, Telnet, וואי, קוֹבֶץ, או פרוסרו. אם זה לא מתחיל בזה, אז זה לא כתובת אתר.

עכשיו שאנחנו מכירים את התחביר, בואו נסתכל על כמה דוגמאות. הנה רשימה של URI, כאשר רק שלוש הראשונות הן כתובות אתרים:

ftp://ftp.is.co.za/rfc/rfc1808.txt //tools.ietf.org/html/rfc3986 mailto: [email protected] טל: + 1-816-555-1212 כד: נווה מדבר: שמות: docbook: dtd: xml: 4.1 כד: isbn: 1234567890

3. הבדלי API API של Java URI ו- URL

בחלק זה נדגים בדוגמאות את ההבדלים העיקריים בין ה- URI ו כתובת אתר שיעורים הניתנים על ידי Java.

3.1. מיידיות

יוצר URI ו כתובת אתר המקרים דומים מאוד, שני הכיתות מספקות כמה בונים שמקבלים את רוב חלקיו, אולם רק את URI בכיתה יש בנאי שיציין את כל חלקי התחביר:

@ מבחן ציבורי בטל כאשרCreatingURIs_thenSameInfo () זורק חריג {URI firstURI = URI חדש ("somescheme: // theuser: [email protected]: 80" + "/ some / path? The query # somefragment"); URI secondURI = URI חדש ("somescheme", "theuser: the password", "someuthority", 80, "/ some / path", "the query", "somefragment"); assertEquals (firstURI.getScheme (), secondURI.getScheme ()); assertEquals (firstURI.getPath (), secondURI.getPath ()); } @Test ציבורי בטל כאשרCreatingURLs_thenSameInfo () זורק חריג {URL firstURL = URL חדש ("// theuser: [email protected]: 80" + "/ path / to / file? The query # somefragment"); URL secondURL = URL חדש ("http", "somehost", 80, "/ path / to / file"); assertEquals (firstURL.getHost (), secondURL.getHost ()); assertEquals (firstURL.getPath (), secondURL.getPath ()); }

ה URI מחלקה מספקת גם שיטת שירות ליצירת מופע חדש שאינו זורק חריג מסומן:

@ מבחן פומבי בטל כאשרCreatingURI_thenCorrect () {URI uri = URI.create ("urn: isbn: 1234567890"); assertNotNull (uri); }

ה כתובת אתר הכיתה אינה מספקת שיטה כזו.

מכיוון שכתובת אתר צריכה להתחיל באחת מהתוכניות שהוזכרו קודם לכן, ניסיון ליצור אובייקט עם אחד אחר יביא לחריג:

@Test (צפוי = MalformedURLException.class) בטל בציבור כאשר CreatingURLs_thenException () זורק חריג {URL theURL = URL חדש ("otherprotocol: // somehost / path / to / file"); assertNotNull (theURL); }

ישנם בונים אחרים בשני השיעורים, כדי לגלות את כולם, עיין בתיעוד ה- URI וכתובת האתר.

3.2. המרה בין מופעי URI ו- URL

המרה בין URI ל- URL די פשוטה:

@ מבט חלל ציבורי שניתןObjects_whenConverting_thenCorrect () זורק MalformedURLException, URISyntaxException {String aURIString = "// somehost: 80 / path? Thequery"; URI uri = URI חדש (aURIString); URL url = URL חדש (aURIString); כתובת אתר toURL = uri.toURL (); URI toURI = url.toURI (); assertNotNull (url); assertNotNull (uri); assertEquals (toURL.toString (), toURI.toString ()); }

עם זאת, ניסיון להמיר URI שאינו כתובת URL גורם לחריג:

@Test (צפוי = MalformedURLException.class) חלל ציבורי שניתןURI_whenConvertingToURL_thenException () זורק MalformedURLException, URISyntaxException {URI uri = URI חדש ("somescheme: // אישיות / נתיב? השאלה"); URL url = uri.toURL (); assertNotNull (url); }

3.3. פתיחת חיבור מרחוק

מכיוון שכתובת אתר היא הפניה חוקית למשאב מרוחק, Java מספקת שיטות לפתיחת חיבור למשאב זה ולהשגת תוכנו:

@ מבט ציבורי בטל שניתןURL_whenGettingContents_thenCorrect () זורק MalformedURLException, IOException {URL url = new URL ("// courses.baeldung.com"); תוכן מחרוזת = IOUtils.toString (url.openStream ()); assertTrue (contents.contains ("")); }

4. מסקנה

במאמר מהיר זה הצגנו כמה דוגמאות כדי להדגים את ההבדל בין URI ו כתובת אתר בג'אווה.

הדגשנו את ההבדלים בעת יצירת מופעים של שני האובייקטים ותוך כדי המרת אובייקט אחד לאחר. הראינו גם כי א כתובת אתר יש שיטות לפתיחת חיבור מרוחק למשאב המחודד.

כמו תמיד, קוד המקור השלם למאמר זה ניתן למצוא באתר Github.