HttpClient 4 - Følg omdirigeringer til POST

1. Oversigt

Denne hurtige vejledning viser, hvordan du konfigurerer Apache HttpClient 4 til automatisk at følge omdirigeringer til POST-anmodninger.

Hvis du vil grave dybere og lære andre seje ting, kan du gøre med HttpClient - gå videre til den vigtigste HttpClient-tutorial.

Som standard følges kun GET-anmodninger, der resulterer i en omdirigering, automatisk. Hvis en POST-anmodning besvares med en af ​​dem HTTP 301 Flyttet permanent eller med 302 fundetomdirigering følges ikke automatisk.

Dette er specificeret af HTTP RFC 2616:

Hvis 301-statuskoden modtages som svar på en anden anmodning end GET eller HEAD, SKAL brugeragenten IKKE automatisk omdirigere anmodningen, medmindre den kan bekræftes af brugeren, da dette kan ændre betingelserne, hvorunder anmodningen blev udstedt.

Der er naturligvis usecases, hvor vi har brug for at ændre denne adfærd og slappe af den strenge HTTP-specifikation.

Lad os først kontrollere standardadfærden:

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

Som du kan se, omdirigering følges ikke som standard, og vi kommer tilbage til 301 Statuskode.

2. Omdirigering på HTTP POST

2.1. For HttpClient 4.3 og efter

I HttpClient 4.3 er der introduceret et højere niveau API til både oprettelse og konfiguration af klienten:

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

Varsel det HttpClientBuilder er nu startpunktet for en flydende API hvilket muliggør fuld konfiguration af klienten på en mere læselig måde end før.

2.2. For HttpClient 4.2

I den tidligere version af HttpClient (4.2) kan vi konfigurere omdirigeringsstrategien direkte på klienten:

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

Bemærk det nu med det nye LaxRedirectStrategy, HTTP-begrænsningerne er afslappede og omdirigering følges også over POST - fører til en 200 OK statuskode.

2.3. Pre HttpClient 4.2

Før HttpClient 4.2, LaxRedirectStrategy klasse eksisterede ikke, så vi er nødt til at rulle vores egne:

@Test offentlig ugyldighed givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected () kaster ClientProtocolException, IOException {DefaultHttpClient-klient = ny 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. Konklusion

Denne hurtige vejledning illustrerede, hvordan man konfigurerer en hvilken som helst version af Apache HttpClient 4 til at følge omdirigeringer til HTTP POST-anmodninger - også afslappende den strenge HTTP-standard.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit github-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.