ביטול הקפדה על כתובות אתרים עם HttpClient

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

במאמר זה אנו נראה כיצד לבטל את קיצור כתובות האתרים באמצעותHttpClient.

דוגמה פשוטה היא מתי כתובת האתר המקורית קוצרה פעם אחת - על ידי שירות כגון bit.ly.

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

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

2. בטל את הקצאת כתובת האתר פעם אחת

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

הדבר הראשון שנצטרך הוא לקוח http זה לא עוקב אוטומטית אחר הפניות מחדש:

CloseableHttpClient client = HttpClientBuilder.create (). DisableRedirectHandling (). Build ();

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

אנו מתחילים בשליחת בקשה לכתובת האתר המקוצרת - התגובה שנקבל תהיה א 301 הועבר לצמיתות.

ואז, אנחנו צריכים לחלץ את מקום כּוֹתֶרֶת מצביע על הבא, ובמקרה זה - כתובת URL סופית:

מחרוזת ציבורית expandSingleLevel (כתובת מחרוזת) זורקת IOException {HttpHead בקשה = null; נסה {בקשה = HttpHead חדש (url); HttpResponse httpResponse = client.execute (בקשה); int statusCode = httpResponse.getStatusLine (). getStatusCode (); אם (statusCode! = 301 && statusCode! = 302) {URL לחזור; } כותרת עליונה [] כותרות = httpResponse.getHeaders (HttpHeaders.LOCATION); תנאים מוקדמים. CheckState (headers.length == 1); מחרוזת newUrl = כותרות [0] .getValue (); החזר newUrl; } לתפוס (IllegalArgumentException uriEx) {כתובת אתר חזרה; } סוף סוף {if (בקשה! = null) {request.releaseConnection (); }}}

לבסוף, בדיקה חיה פשוטה המרחיבה את כתובת האתר:

@Test ציבורי בטל givenShortenedOnce_whenUrlIsUnshortened_thenCorrectResult () זורק IOException {String expectResult = "/ rest-versioning"; מחרוזת actualResult = expandSingleLevel ("// bit.ly/13jEoS1"); assertThat (actualResult, equalTo (expectResult)); }

3. עיבוד רמות כתובות אתרים מרובות

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

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

public String הרחבה (String urlArg) זורק IOException {String originalUrl = urlArg; מחרוזת newUrl = expandSingleLevel (originalUrl); בעוד (! originalUrl.equals (newUrl)) {originalUrl = newUrl; newUrl = expandSingleLevel (originalUrl); } להחזיר newUrl; }

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

@ מבחן הריק ציבורי givenShortenedMultiple_whenUrlIsUnshortened_thenCorrectResult () זורק IOException {String expectResult = "/ rest-versioning"; מחרוזת actualResult = להרחיב ("// t.co/e4rDDbnzmk"); assertThat (actualResult, equalTo (expectResult)); }

הפעם, כתובת האתר הקצרה - //t.co/e4rDDbnzmk - שלמעשה מקוצר פעמיים - פעם דרך bit.ly ופעם שנייה דרך t.co שירות - מורחב כהלכה לכתובת האתר המקורית.

4. זיהוי בלולאות הפניה

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

השלב האחרון במנגנון הרחבת כתובות ה- URL יהיה איתור לולאות ההפניה וכשל מהיר במקרה שתתרחש לולאה כזו.

כדי שזה יהיה יעיל, אנו זקוקים למידע נוסף מחוץ ל- הרחב יחיד שיטה שהגדרנו קודם - בעיקר, עלינו להחזיר גם את קוד הסטטוס של התגובה יחד עם כתובת ה- URL.

מכיוון ש- Java אינה תומכת בערכי החזרה מרובים, אנו הולכים לעטוף את המידע בא org.apache.commons.lang3.tuple.Pair לְהִתְנַגֵד - החתימה החדשה של השיטה תהיה כעת:

ציבורי ציבורי expandSingleLevelSafe (URL String) זורק IOException {

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

מחרוזת ציבורית expandSafe (String urlArg) זורק IOException {String originalUrl = urlArg; מחרוזת newUrl = expandSingleLevelSafe (originalUrl) .getRight (); List alreadyVisited = Lists.newArrayList (originalUrl, newUrl); בעוד (! originalUrl.equals (newUrl)) {originalUrl = newUrl; זוג statusAndUrl = expandSingleLevelSafe (originalUrl); newUrl = statusAndUrl.getRight (); isRedirect בוליאני = statusAndUrl.getLeft () == 301 || statusAndUrl.getLeft () == 302; if (isRedirect && alreadyVisited.contains (newUrl)) {זרוק IllegalStateException חדש ("כנראה לולאת הפניה מחדש"); } alreadyVisited.add (newUrl); } להחזיר newUrl; }

וזהו - ה expandSafe מנגנון מסוגל לבטל את קיצור כתובת האתר שעוברת על מספר שרירותי של שירותי קיצור כתובות אתרים, תוך כשל נכונה במהירות בלולאות הפניה.

5. מסקנה

הדרכה זו דנה כיצד הרחב כתובות אתרים קצרות בג'אווה - באמצעות אפאצ'י HttpClient.

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

ניתן למצוא את היישום של דוגמאות אלה בפרויקט github - זהו פרויקט מבוסס Eclipse, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


$config[zx-auto] not found$config[zx-overlay] not found