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.


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