HttpClient 4 - Postupujte podľa presmerovaní pre POST

1. Prehľad

Tento rýchly tutoriál ukáže, ako nakonfigurovať Apache HttpClient 4 tak, aby automaticky sledoval presmerovania pre požiadavky POST.

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.

V predvolenom nastavení sa automaticky sledujú iba žiadosti GET vedúce k presmerovaniu. Ak na žiadosť POST odpovie buď HTTP 301 bol presunutý natrvalo alebo s 302 Nájdenépresmerovanie sa automaticky nesleduje.

Toto špecifikuje protokol HTTP RFC 2616:

Ak je stavový kód 301 prijatý ako odpoveď na požiadavku inú ako GET alebo HEAD, užívateľský agent NEMUSÍ automaticky automaticky presmerovať požiadavku, pokiaľ ju užívateľ nemôže potvrdiť, pretože by to mohlo zmeniť podmienky, za ktorých bola požiadavka vydaná.

Existujú samozrejme prípady použitia, pri ktorých musíme toto správanie zmeniť a zmierniť prísnu špecifikáciu protokolu HTTP.

Najskôr skontrolujme predvolené správanie:

@ Test public void givenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected () vyvolá ClientProtocolException, IOException {HttpClient instance = HttpClientBuilder.create (). Build (); HttpResponse response = instance.execute (nový HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (301)); }

Ako môžeš vidieť, presmerovanie nie je predvolene sledovanéa dostaneme späť 301 Stavový kód.

2. Presmerovanie na HTTP POST

2.1. Pre HttpClient 4.3 a nasledujúce

V HttpClient 4.3 bolo zavedené API vyššej úrovne pre tvorbu aj konfiguráciu klienta:

@Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () hodí ClientProtocolException, IOException {HttpClient instance = HttpClientBuilder.create (). SetRedirectStrategy (new LaxRedirectStr) HttpResponse response = instance.execute (nový HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Všimnite si the HttpClientBuilder je teraz východiskovým bodom plynulého rozhrania API ktorá umožňuje úplnú konfiguráciu klienta čitateľnejším spôsobom ako doteraz.

2.2. Pre HttpClient 4.2

V predchádzajúcej verzii HttpClient (4.2) môžeme nakonfigurovať stratégiu presmerovania priamo na klientovi:

@SuppressWarnings ("podpora") @Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () vyvolá ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (nový LaxRedirectStrategy ()); HttpResponse response = client.execute (nový HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Všimnite si, že teraz, s novým LaxRedirectStrategy, obmedzenia HTTP sú uvoľnené a presmerovanie sa sleduje aj cez POST - vedúci k a 200 OK stavový kód.

2.3. Pred HttpClient 4.2

Pred HttpClient 4.2, LaxRedirectStrategy trieda neexistovala, takže si musíme vytvoriť vlastnú:

@ Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () hodí ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (new DefaultRedirectStrategy () {/ ** Presmerovateľné metódy. * / private String [] REDIRECT_METHODS = nový reťazec [] {HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME}; metóda Boolean chránená metódou StringReRring) {for (String m: REDIRECT_METHODS) {if (m.equalsIgnoreCase (method)) {return true;}} return false;}}); HttpResponse response = client.execute (nový HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

3. Záver

Tento rýchly sprievodca ilustroval, ako nakonfigurovať ľubovoľnú verziu Apache HttpClient 4 tak, aby sledovala aj presmerovania pre požiadavky HTTP POST - uvoľnenie prísneho štandardu HTTP.

Implementácia všetkých týchto príkladov a útržkov kódu nájdete v mojom projekte github - toto je projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.