Az URL-ek rövidítése a HttpClient segítségével
1. Áttekintés
Ebben a cikkben megmutatjuk, hogyan kell rövidítse le az URL-ek használatátHttpClient.
Egyszerű példa, amikor az eredeti URL egyszer lerövidült - olyan szolgáltatás által, mint bit.ly.
Összetettebb példa, amikor az URL többször lerövidült, különböző ilyen szolgáltatások által, és az eredeti teljes URL-hez való eljutáshoz többször is szükség van.
Ha mélyebbre akarsz ásni, és további jó dolgokat akarsz megtudni, amit a HttpClient-nel tehetsz - menj tovább a fő HttpClient oktatóanyag.
2. Egyszer rövidítse le az URL rövidítését
Kezdjük egyszerűen: szüntesse meg az URL rövidítését, amelyet csak egyszer adtak meg a rövidítési URL-szolgáltatáson keresztül.
Először egy http kliensre lesz szükségünk nem követi automatikusan az átirányításokat:
CloseableHttpClient kliens = HttpClientBuilder.create (). DisableRedirectHandling (). Build ();
Erre azért van szükség, mert manuálisan kell elfognunk az átirányítási választ, és információkat kell kibontanunk belőle.
Kezdjük azzal, hogy kérelmet küldünk a rövidített URL-re - a válasz a 301 Véglegesen költözött.
Akkor nekünk kell kivonat a Elhelyezkedés fejléc rámutatva a következő, és ebben az esetben - végső URL-re:
public String expandSingleLevel (String url) dobja az IOException-t {HttpHead request = null; próbáld ki a {request = new HttpHead (url) parancsot; HttpResponse httpResponse = client.execute (kérés); int statusCode = httpResponse.getStatusLine (). getStatusCode (); if (statusCode! = 301 && statusCode! = 302) {return url; } Fejléc [] fejlécek = httpResponse.getHeaders (HttpHeaders.LOCATION); Előfeltételek.checkState (fejléc.hossz == 1); Karakterlánc newUrl = fejlécek [0] .getValue (); return newUrl; } catch (IllegalArgumentException uriEx) {return url; } végül {if (kérelem! = null) {request.releaseConnection (); }}}
Végül egy egyszerű élő teszt, amely kibővíti az URL-t:
@Test public void givenShortenedOnce_whenUrlIsUnshortened_thenCorrectResult () dobja az IOException-t {String várhatóResult = "/ rest-versioning"; String actualResult = expandSingleLevel ("// bit.ly/13jEoS1"); assertThat (ténylegesEredmény, egyenlőTo (várható eredmény)); }
3. Több URL-szint feldolgozása
A rövid URL-ekkel az a probléma, hogy azok lehetnek többször lerövidítve, teljesen különböző szolgáltatásokkal. Egy ilyen URL kibővítéséhez többször is meg kell adni az eredeti URL-t.
Alkalmazni fogjuk a expandSingleLevel primitív művelet, amelyet korábban egyszerűen definiáltunk ismételje meg az összes közvetítő URL-t, és jusson el a végső célig:
public String expand (String urlArg) dobja az IOException-t {String originalUrl = urlArg; String newUrl = expandSingleLevel (originalUrl); while (! originalUrl.equals (newUrl)) {originalUrl = newUrl; newUrl = expandSingleLevel (originalUrl); } return newUrl; }
Az URL-ek többszintű kibővítésének új mechanizmusával határozzunk meg egy tesztet, és tegyük ezt működésbe:
@Test public void givenShortenedMultiple_whenUrlIsUnshortened_thenCorrectResult () dobja az IOException-t {String várhatóResult = "/ rest-versioning"; String actualResult = expand ("// t.co/e4rDDbnzmk"); assertThat (ténylegesEredmény, egyenlőTo (várható eredmény)); }
Ezúttal a rövid URL - //t.co/e4rDDbnzmk - ami valójában kétszer rövidül - egyszer keresztül bit.ly másodszor pedig a t.co szolgáltatás - helyesen van kibővítve az eredeti URL-re.
4. Észlelés az átirányítási hurkokon
Végül néhány URL-t nem lehet kibővíteni, mert átirányítási ciklust alkotnak. Az ilyen típusú problémát a HttpClient, de mivel kikapcsoltuk az átirányítások automatikus követését, már nem.
Az URL-bővítési mechanizmus utolsó lépése az átirányítási hurkok észlelése lesz, és gyorsan meghiúsul, ha ilyen hurok fordul elő.
Ahhoz, hogy ez hatékony legyen, további információkra van szükségünk a expandSingleLevel módszer, amelyet korábban definiáltunk - főleg vissza kell adnunk a válasz állapotkódját az URL-lel együtt.
Mivel a java nem támogatja a több visszatérési értéket, ezért fogunk csomagolja be az információkat a org.apache.commons.lang3.tuple.Pair tárgy - A módszer új aláírása a következő lesz:
public Pair expandSingleLevelSafe (karakterlánc URL) dobja az IOException {
Végül foglaljuk bele az átirányítási ciklus észlelését a fő kiterjesztési mechanizmusba:
public String expandSafe (String urlArg) dobja az IOException-t {String originalUrl = urlArg; String newUrl = expandSingleLevelSafe (originalUrl) .getRight (); List jubaVisited = Lists.newArrayList (originalUrl, newUrl); while (! originalUrl.equals (newUrl)) {originalUrl = newUrl; Páros állapotAndUrl = expandSingleLevelSafe (originalUrl); newUrl = statusAndUrl.getRight (); logikai isRedirect = statusAndUrl.getLeft () == 301 || statusAndUrl.getLeft () == 302; if (isRedirect && alreadyVisited.contains (newUrl)) {dobjon új IllegalStateException-t ("Valószínűleg átirányítási hurok"); } márVisited.add (newUrl); } return newUrl; }
És ennyi - a expandBiztonság A mechanizmus képes leválasztani az URL-t tetszőleges számú URL-rövidítési szolgáltatáson keresztül, miközben az átirányítási hurkokon gyorsan nem sikerül.
5. Következtetés
Ez az oktatóanyag megvitatta, hogyan kell bővítse ki a rövid URL-eket a java-ban - az Apache használatával HttpClient.
Először egy egyszer használatos URL-címmel kezdtük meg, amelyet csak egyszer rövidítünk le, majd egy általánosabb mechanizmust valósítottunk meg, amely képes kezelni az átirányítások több szintjét és észlelni az átirányítási hurkokat a folyamatban.
Ezeknek a példáknak a megvalósítása megtalálható a github projektben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.