Poništite skraćivanje URL-ova pomoću HttpClienta

1. Pregled

U ovom ćemo članku pokazati kako to učiniti poništite skraćivanje URL-ova pomoćuHttpClient.

Jednostavan primjer je kada izvorni URL jednom je skraćen - uslugom kao što je bit.ly.

Složeniji je primjer kada URL je skraćen više puta, različite takve usluge, i potrebno je više prolaza da bi se došlo do izvornog punog URL-a.

Ako želite dublje kopati i naučiti druge cool stvari koje možete učiniti s HttpClientom, krenite na glavni vodič za HttpClient.

2. Jednom poništite URL

Krenimo jednostavno - poništite URL koji je samo jednom prošao kroz uslugu skraćenog URL-a.

Prva stvar koja će nam trebati je http klijent koji ne slijedi automatski preusmjeravanja:

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

To je neophodno jer ćemo morati ručno presresti odgovor o preusmjeravanju i iz njega izvući podatke.

Započinjemo slanjem zahtjeva na skraćeni URL - odgovor koji dobijemo bit će 301 Premješteno trajno.

Onda, trebamo izvaditi Mjesto Zaglavlje pokazujući na sljedeći, a u ovom slučaju - na konačni URL:

javni String expandSingleLevel (URL niza) baca IOException {HttpHead zahtjev = null; pokušajte {request = new HttpHead (url); HttpResponse httpResponse = client.execute (zahtjev); int statusCode = httpResponse.getStatusLine (). getStatusCode (); if (statusCode! = 301 && statusCode! = 302) {url; } Header [] headers = httpResponse.getHeaders (HttpHeaders.LOCATION); Preduvjeti.checkState (headers.length == 1); Niz newUrl = zaglavlja [0] .getValue (); povratak newUrl; } catch (IllegalArgumentException uriEx) {return url; } napokon {if (zahtjev! = null) {request.releaseConnection (); }}}

Na kraju, jednostavan test uživo koji proširuje URL:

@Test javna praznina givenShortenedOnce_whenUrlIsUnshortened_thenCorrectResult () baca IOException {String očekujeResult = "/ rest-versioning"; String actualResult = expandSingleLevel ("// bit.ly/13jEoS1"); assertThat (stvarni rezultat, jednak rezultatu (očekivani rezultat)); }

3. Obradite više razina URL-a

Problem s kratkim URL-ovima je taj što mogu biti višekratno skraćen, potpuno različitim uslugama. Za proširivanje takvog URL-a trebat će više prolaza da biste došli do izvornog URL-a.

Primijenit ćemo expandSingleLevel primitivna operacija definirana prethodno na jednostavno prelistajte sve posredničke URL-ove i dođite do konačnog cilja:

javni String proširiti (String urlArg) baca IOException {String originalUrl = urlArg; Niz newUrl = expandSingleLevel (originalUrl); while (! originalUrl.equals (newUrl)) {originalUrl = newUrl; newUrl = expandSingleLevel (originalUrl); } return newUrl; }

Sada, s novim mehanizmom proširivanja više razina URL-ova, definirajmo test i provedimo ovo:

@Test javna praznina givenShortenedMultiple_whenUrlIsUnshortened_thenCorrectResult () baca IOException {String očekujeResult = "/ rest-versioning"; Niz stvarni rezultat = proširiti ("// t.co/e4rDDbnzmk"); assertThat (stvarni rezultat, jednak rezultatu (očekivani rezultat)); }

Ovaj put, kratki URL - //t.co/e4rDDbnzmk - što se zapravo skraćuje dva puta - jednom putem bit.ly i drugi put putem t.co usluga - ispravno je proširena na izvorni URL.

4. Otkrivanje na petljama za preusmjeravanje

Konačno, neke URL-ove nije moguće proširiti jer čine petlju za preusmjeravanje. Ovu vrstu problema otkrio bi HttpClient, ali budući da smo isključili automatsko praćenje preusmjeravanja, to više ne čini.

Posljednji korak u mehanizmu proširenja URL-a bit će otkrivanje petlji za preusmjeravanje i brzi neuspjeh u slučaju da se takva petlja dogodi.

Da bi ovo bilo učinkovito, potrebne su nam neke dodatne informacije iz expandSingleLevel metodu koju smo definirali ranije - uglavnom moramo vratiti i statusni kôd odgovora zajedno s URL-om.

Budući da java ne podržava višestruke povratne vrijednosti, idemo zamotajte podatke u org.apache.commons.lang3.tuple.Par objekt - novi potpis metode sada će biti:

public Pair expandSingleLevelSafe (String url) baca IOException {

I na kraju, uključimo otkrivanje preusmjeravanja u glavni mehanizam proširenja:

javni String expandSafe (String urlArg) baca IOException {String originalUrl = urlArg; Niz newUrl = expandSingleLevelSafe (originalUrl) .getRight (); Popis alreadyVisited = Lists.newArrayList (originalUrl, newUrl); while (! originalUrl.equals (newUrl)) {originalUrl = newUrl; Upari statusAndUrl = expandSingleLevelSafe (originalUrl); newUrl = statusAndUrl.getRight (); boolean isRedirect = statusAndUrl.getLeft () == 301 || statusAndUrl.getLeft () == 302; if (isRedirect && alreadyVisited.contens (newUrl)) {throw new IllegalStateException ("Vjerojatno petlja za preusmjeravanje"); } većVisited.add (newUrl); } return newUrl; }

I to je to - expandSafe mehanizam je u stanju ukloniti skraćivanje URL-a koji prolazi kroz proizvoljan broj usluga skraćivanja URL-a, dok ispravno brzo ne uspijeva u petljama preusmjeravanja.

5. Zaključak

U ovom se vodiču govorilo o tome kako proširiti kratke URL-ove u javi - koristeći Apache HttpClient.

Počeli smo s jednostavnim slučajem upotrebe s URL-om koji se samo jednom skraćuje, a zatim smo implementirali općenitiji mehanizam, sposoban za obradu više razina preusmjeravanja i otkrivanje petlji preusmjeravanja u procesu.

Implementacija ovih primjera može se naći u projektu github - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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