HttpClient 4 - Umleitungen für POST folgen

HttpClient 4 - Folgen Sie den Umleitungen für den POST

1. Überblick

In diesem kurzen Tutorial wird gezeigt, 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 zuthe main HttpClient tutorial.

Standardmäßig werden nur GET-Anforderungen, die zu einer Umleitung führen, automatisch befolgt. Wenn eine POST-Anfrage entweder mitHTTP 301 Moved Permanently oder mit302 Found -the redirect is not automatically followed beantwortet wird.

Dies wird durchHTTP RFC 2616 angegeben:

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 ausgestellt wurde.

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

Überprüfen wir zunächst das Standardverhalten:

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

Wie Sie sehen können,the redirect is not followed by default, und wir erhalten die301 Status Code zurück.

2. Umleitung auf HTTP POST

2.1. Für HttpClient 4.3 und danach

In HttpClient 4.3 wurde eine API höherer Ebene für die Erstellung und 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("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

Beachten Siethe HttpClientBuilder is now the starting point of a fluent API, mit dem der Client besser als zuvor vollständig konfiguriert werden kann.

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("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

Beachten Sie, dass jetzt mit den neuenLaxRedirectStrategy die HTTP-Einschränkungen gelockert werden undthe redirect is followed over POST as well - was zu einem200 OK-Statuscode führt.

2.3. Pre HttpClient 4.2

Vor HttpClient 4.2 war die KlasseLaxRedirectStrategynicht 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("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

3. Fazit

Diese Kurzanleitung zeigt, wie Sie eine beliebige Version von Apache HttpClient 4 so konfigurieren, dass auch Umleitungen für HTTP-POST-Anforderungen befolgt werden.

Die Implementierung all dieser Beispiele und Codefragmentecan be found in my github project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.