HttpClient 4 - Volg omleidingen voor POST

1. Overzicht

Deze korte tutorial laat zien hoe je de Apache HttpClient 4 configureert om automatisch omleidingen voor POST-verzoeken te volgen.

Als je dieper wilt graven en andere coole dingen wilt leren die je kunt doen met de HttpClient - ga dan naar de belangrijkste HttpClient-zelfstudie.

Standaard worden alleen GET-verzoeken die resulteren in een omleiding automatisch gevolgd. Als een POST-verzoek wordt beantwoord met een van beide HTTP 301 permanent verplaatst of met 302 gevondende omleiding wordt niet automatisch gevolgd.

Dit wordt gespecificeerd door de HTTP RFC 2616:

Als de 301-statuscode wordt ontvangen in reactie op een ander verzoek dan GET of HEAD, MOET de user-agent het verzoek NIET automatisch omleiden, tenzij het kan worden bevestigd door de gebruiker, aangezien dit de voorwaarden waaronder het verzoek werd gedaan zou kunnen veranderen.

Er zijn natuurlijk gevallen waarin we dat gedrag moeten veranderen en de strikte HTTP-specificatie moeten versoepelen.

Laten we eerst het standaardgedrag controleren:

@Test openbare ongeldige gegevenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected () gooit ClientProtocolException, IOException {HttpClient instantie = HttpClientBuilder.create (). Build (); HttpResponse response = instance.execute (nieuwe HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (301)); }

Zoals je kunt zien, de omleiding wordt niet standaard gevolgd, en we krijgen de 301 Statuscode.

2. Omleiden op HTTP POST

2.1. Voor HttpClient 4.3 en later

In HttpClient 4.3 is een API op een hoger niveau geïntroduceerd voor zowel het maken als configureren van de client:

@Test openbare ongeldige gegevenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () gooit ClientProtocolException, IOException {HttpClient instance = HttpClientBuilder.create (). SetRedirectStrategy (nieuwe LaxRedirects) (). HttpResponse response = instance.execute (nieuwe HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Merk op de HttpClientBuilder is nu het startpunt van een vloeiende API waardoor de volledige configuratie van de client op een meer leesbare manier dan voorheen mogelijk is.

2.2. Voor HttpClient 4.2

In de vorige versie van HttpClient (4.2) kunnen we de omleidingsstrategie rechtstreeks op de client configureren:

@SuppressWarnings ("deprecation") @ Test openbare ongeldig gegevenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () gooit ClientProtocolException, IOException {DefaultHttpClient client = nieuwe DefaultHttpClient (); client.setRedirectStrategy (nieuwe LaxRedirectStrategy ()); HttpResponse response = client.execute (nieuwe HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

Merk op dat nu, met de nieuwe LaxRedirectStrategy, de HTTP-beperkingen zijn versoepeld en de omleiding wordt ook via POST gevolgd - leidend tot een 200 OK status code.

2.3. Pre HttpClient 4.2

Vóór HttpClient 4.2 was het LaxRedirectStrategy klasse bestond niet, dus we moeten onze eigen klasse rollen:

@Test openbare ongeldig gegevenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () gooit ClientProtocolException, IOException {DefaultHttpClient client = nieuwe DefaultHttpClient (); client.setRedirectStrategy (nieuwe DefaultRedirectStrategy () {/ ** Redirectable methoden. * / private String [] REDIRECT_METHODS = nieuwe String [] {HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME}; @Override beveiligde boolean isRed-methode) {for (String m: REDIRECT_METHODS) {if (m.equalsIgnoreCase (methode)) {return true;}} return false;}}); HttpResponse response = client.execute (nieuwe HttpPost ("// t.co/I5YYd9tddw")); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

3. Conclusie

Deze korte handleiding illustreert hoe u elke versie van de Apache HttpClient 4 configureert om ook omleidingen voor HTTP POST-verzoeken te volgen - waardoor de strikte HTTP-standaard wordt versoepeld.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in mijn github-project - dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.