HttpClient 4 - Folgen Sie den Weiterleitungen für POST

1. Übersicht

Dieses kurze Tutorial zeigt, wie Sie den Apache HttpClient 4 so konfigurieren, dass er automatisch Weiterleitungen für POST-Anforderungen folgt.

Wenn Sie tiefer graben und andere coole Dinge lernen möchten, die Sie mit dem HttpClient tun können, gehen Sie zum Haupt-HttpClient-Tutorial .

Standardmäßig werden nur GET-Anforderungen, die zu einer Umleitung führen, automatisch verfolgt. Wenn eine POST - Anfragen mit beide beantwortet wird HTTP 301 dauerhaft verschoben oder mit 302 Gefunden - die Umleitung wird nicht automatisch verfolgt .

Dies wird im HTTP-RFC 2616 festgelegt:

Wenn der 301-Statuscode als Antwort auf eine andere Anforderung als GET oder HEAD empfangen wird, darf der Benutzeragent die Anforderung NICHT automatisch umleiten, es sei denn, dies kann vom Benutzer bestätigt werden, da dies die Bedingungen ändern kann, unter denen die Anforderung ausgegeben wurde.

Es gibt natürlich Anwendungsfälle, in denen wir dieses Verhalten ändern und die strenge HTTP-Spezifikation lockern müssen.

Lassen Sie uns zunächst das Standardverhalten überprüfen:

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

Wie Sie sehen können, folgt auf die Umleitung nicht standardmäßig , und wir erhalten den 301-Statuscode zurück .

2. Umleitung auf HTTP POST

2.1. Für HttpClient 4.3 und danach

In HttpClient 4.3 wurde eine übergeordnete API sowohl für die Erstellung als auch für die Konfiguration des Clients eingeführt:

@Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected() throws ClientProtocolException, IOException { HttpClient instance = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build(); HttpResponse response = instance.execute(new HttpPost("//t.co/I5YYd9tddw")); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

Beachten Sie, dass der HttpClientBuilder jetzt der Ausgangspunkt einer fließenden API ist, die eine vollständige Konfiguration des Clients auf eine besser lesbare Weise als zuvor ermöglicht.

2.2. Für HttpClient 4.2

In der vorherigen Version von HttpClient (4.2) können wir die Umleitungsstrategie direkt auf dem Client konfigurieren:

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

Beachten Sie, dass jetzt mit der neuen LaxRedirectStrategy die HTTP-Einschränkungen gelockert werden und die Umleitung auch über den POST verfolgt wird - was zu einem Statuscode von 200 OK führt .

2.3. Pre HttpClient 4.2

Vor HttpClient 4.2 war die LaxRedirectStrategy- Klasse nicht vorhanden, daher müssen wir unsere eigene rollen:

@Test public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected() throws ClientProtocolException, IOException { DefaultHttpClient client = new DefaultHttpClient(); client.setRedirectStrategy(new DefaultRedirectStrategy() { /** Redirectable methods. */ private String[] REDIRECT_METHODS = new String[] { HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME }; @Override protected boolean isRedirectable(String method) { for (String m : REDIRECT_METHODS) { if (m.equalsIgnoreCase(method)) { return true; } } return false; } }); HttpResponse response = client.execute(new HttpPost("//t.co/I5YYd9tddw")); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

3. Fazit

In dieser Kurzanleitung wurde veranschaulicht, wie eine beliebige Version des Apache HttpClient 4 so konfiguriert wird, dass auch Weiterleitungen für HTTP-POST-Anforderungen befolgt werden. Dabei wird der strenge HTTP-Standard gelockert.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in meinem Github-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.