HttpClient 4 - Følg omdirigeringer for POST

1. Oversikt

Denne raske opplæringen viser hvordan du konfigurerer Apache HttpClient 4 for automatisk å følge omdirigeringer for POST-forespørsler.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med HttpClient - gå videre til den viktigste HttpClient-opplæringen.

Som standard følges bare GET-forespørsler som resulterer i en omdirigering automatisk. Hvis en POST-forespørsel blir besvart med en av dem HTTP 301 flyttet permanent eller med 302 funnetviderekoblingen følges ikke automatisk.

Dette er spesifisert av HTTP RFC 2616:

Hvis 301-statuskoden mottas som svar på en annen forespørsel enn GET eller HEAD, MÅ brukeragenten IKKE automatisk omdirigere forespørselen med mindre den kan bekreftes av brukeren, siden dette kan endre vilkårene som forespørselen ble utstedt under.

Det er selvfølgelig brukstilfeller der vi trenger å endre atferden og slappe av den strenge HTTP-spesifikasjonen.

La oss først sjekke standard oppførsel:

@Test offentlig ugyldig givenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected () kaster ClientProtocolException, IOException {HttpClient-forekomst = HttpClientBuilder.create (). Build (); HttpResponse respons = eksempel.execute (ny HttpPost ("// t.co/I5YYd9tddw")); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (301)); }

Som du kan se, omdirigering følges ikke som standard, og vi får tilbake 301 Statuskode.

2. Omdirigering på HTTP POST

2.1. For HttpClient 4.3 og After

I HttpClient 4.3 har et høyere nivå API blitt introdusert for både opprettelse og konfigurasjon av klienten:

@Test offentlig ugyldig givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () kaster ClientProtocolException, IOException {HttpClient-forekomst = HttpClientBuilder.create (). SetRedirectStrategy (ny LaxRedirectStrategi). HttpResponse respons = eksempel.execute (ny HttpPost ("// t.co/I5YYd9tddw")); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Legge merke til de HttpClientBuilder er nå utgangspunktet for et flytende API som tillater full konfigurering av klienten på en mer lesbar måte enn før.

2.2. For HttpClient 4.2

I den forrige versjonen av HttpClient (4.2) kan vi konfigurere viderekoblingsstrategien direkte på klienten:

@SuppressWarnings ("deprecation") @Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () kaster ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (ny LaxRedirectStrategy ()); HttpResponse respons = client.execute (ny HttpPost ("// t.co/I5YYd9tddw")); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

Legg merke til det nå, med det nye LaxRedirectStrategy, HTTP-begrensningene er avslappede og viderekoblingen følges også over POST - fører til en 200 OK statuskode.

2.3. Pre HttpClient 4.2

Før HttpClient 4.2, ble LaxRedirectStrategy klasse eksisterte ikke, så vi må rulle våre egne:

@Test offentlig ugyldighet gittRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () kaster ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient (); client.setRedirectStrategy (ny DefaultRedirectStrategy () {/ ** Omdirigerbare metoder. * / privat streng [] REDIRECT_METHODS = ny streng [] {HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME}; @Override-beskyttet bool er {for (String m: REDIRECT_METHODS) {if (m.equalsIgnoreCase (metode)) {return true;}} returner false;}}); HttpResponse respons = client.execute (ny HttpPost ("// t.co/I5YYd9tddw")); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

3. Konklusjon

Denne hurtigveiledningen illustrerte hvordan du konfigurerer en hvilken som helst versjon av Apache HttpClient 4 for å følge omdirigeringer for HTTP POST-forespørsler også - avslappende den strenge HTTP-standarden.

Implementeringen av alle disse eksemplene og kodebiter finner du i github-prosjektet mitt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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