Skráťte adresy URL pomocou HttpClient

1. Prehľad

V tomto článku si ukážeme, ako na to skráťte adresy URL pomocouHttpClient.

Jednoduchým príkladom je, keď pôvodná adresa URL bola raz skrátená - službou ako napr bit.ly.

Zložitejším príkladom je, keď adresa URL bola niekoľkokrát skrátenárôznymi rôznymi službami a získanie pôvodnej úplnej adresy URL vyžaduje niekoľko priechodov.

Ak sa chcete prehĺbiť a naučiť sa ďalšie super veci, ktoré môžete s HttpClient robiť - choďte ďalej hlavný návod HttpClient.

2. Raz URL skráťte

Začnime jednoduchým spôsobom - zrušte skrátenie adresy URL, ktorá bola prostredníctvom služby skrátených adries URL odovzdaná iba raz.

Prvá vec, ktorú budeme potrebovať, je http klient automaticky nesleduje presmerovania:

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

Je to nevyhnutné, pretože budeme musieť manuálne zachytiť odpoveď na presmerovanie a vyťažiť z nej informácie.

Začíname odoslaním žiadosti na skrátenú adresu URL - odpoveď, ktorú dostaneme späť, bude a 301 trvale presunutý.

Potom musíme extrahovať Poloha hlavička smerujúce na nasledujúcu, v tomto prípade - konečnú webovú adresu:

public String expandSingleLevel (String url) vyvolá IOException {HttpHead request = null; try {request = new HttpHead (url); HttpResponse httpResponse = client.execute (požiadavka); int statusCode = httpResponse.getStatusLine (). getStatusCode (); if (statusCode! = 301 && statusCode! = 302) {return url; } Hlavička [] hlavičky = httpResponse.getHeaders (HttpHeaders.LOCATION); Preconditions.checkState (headers.length == 1); Reťazec newUrl = hlavičky [0] .getValue (); vrátiť newUrl; } catch (IllegalArgumentException uriEx) {return url; } nakoniec {if (request! = null) {request.releaseConnection (); }}}

Na záver jednoduchý test rozšírenia adresy URL naživo:

@Test public void givenShortenedOnce_whenUrlIsUnshortened_thenCorrectResult () vyvolá IOException {String expectResult = "/ rest-versioning"; Reťazec actualResult = expandSingleLevel ("// bit.ly/13jEoS1"); assertThat (actualResult, equalTo (expectResult)); }

3. Spracujte viac úrovní URL

Problém s krátkymi adresami URL je, že môžu byť viackrát skrátené, celkom rôznymi službami. Rozbalenie takejto adresy URL bude vyžadovať viacnásobné povolenie, aby ste sa dostali k pôvodnej adrese URL.

Použijeme expandSingleLevel primitívna operácia definovaná predtým jednoducho iterovať cez všetky sprostredkujúce adresy URL a dostať sa ku konečnému cieľu:

public String expand (String urlArg) vyvolá IOException {String originalUrl = urlArg; Reťazec newUrl = expandSingleLevel (originalUrl); while (! originalUrl.equals (newUrl)) {originalUrl = newUrl; newUrl = expandSingleLevel (originalUrl); } vrátiť newUrl; }

Teraz, s novým mechanizmom rozširovania viacerých úrovní adries URL, definujme test a začnime s týmto:

@Test public void givenShortenedMultiple_whenUrlIsUnshortened_thenCorrectResult () vyvolá IOException {String expectResult = "/ rest-versioning"; Reťazec actualResult = expand ("// t.co/e4rDDbnzmk"); assertThat (actualResult, equalTo (expectResult)); }

Krátka adresa URL - //t.co/e4rDDbnzmk - ktorý je v skutočnosti skrátený dvakrát - raz cez bit.ly a druhýkrát cez internet t.co služba - je správne rozšírená na pôvodnú adresu URL.

4. Zistiť na presmerovacích slučkách

Niektoré adresy URL nakoniec nemožno rozšíriť, pretože tvoria slučku presmerovania. Tento typ problému by zistil HttpClient, ale keďže sme vypli automatické sledovanie presmerovaní, už to tak nie je.

Posledným krokom v mechanizme rozširovania adries URL bude detekcia slučiek presmerovania a rýchle zlyhanie v prípade, že k takejto slučke dôjde.

Aby to bolo efektívne, potrebujeme zo servera ďalšie informácie expandSingleLevel metóda, ktorú sme definovali skôr - hlavne musíme vrátiť aj stavový kód odpovede spolu s URL.

Pretože java nepodporuje viac návratových hodnôt, ideme na zabaliť informácie do a org.apache.commons.lang3.tuple.Pair objekt - nový podpis metódy bude teraz:

public Pair expandSingleLevelSafe (adresa reťazca) vyvolá IOException {

A nakoniec zahrňme detekciu cyklu presmerovania do hlavného mechanizmu rozšírenia:

public String expandSafe (String urlArg) vyvolá IOException {String originalUrl = urlArg; Reťazec newUrl = expandSingleLevelSafe (originalUrl) .getRight (); List alreadyVisited = Lists.newArrayList (originalUrl, newUrl); while (! originalUrl.equals (newUrl)) {originalUrl = newUrl; Pair statusAndUrl = expandSingleLevelSafe (originalUrl); newUrl = statusAndUrl.getRight (); boolean isRedirect = statusAndUrl.getLeft () == 301 || statusAndUrl.getLeft () == 302; if (isRedirect && alreadyVisited.contains (newUrl)) {throw new IllegalStateException ("Likely a redirect loop"); } alreadyVisited.add (newUrl); } vrátiť newUrl; }

A je to - expandSafe mechanizmus je schopný zrušiť skrátenie adresy URL prechádzajúcej ľubovoľným počtom služieb na skrátenie adresy URL, zatiaľ čo správne zlyháva rýchlo v slučkách presmerovania.

5. Záver

V tomto výučbe sa diskutovalo o tom, ako na to rozbaliť krátke adresy URL v - pomocou Apache HttpClient.

Začali sme jednoduchým prípadom použitia s adresou URL, ktorá sa skracuje iba raz, a potom sme implementovali všeobecnejší mechanizmus schopný zvládnuť viac úrovní presmerovaní a zistiť v tomto procese slučky presmerovania.

Implementáciu týchto príkladov možno nájsť v projekte github - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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