HttpClient 4 - Suivre les redirections pour le POST

HttpClient 4 - Suivez les redirections pour le POST

1. Vue d'ensemble

Ce rapide tutoriel montrera comment configurer Apache HttpClient 4 pour qu'il suive automatiquement les redirections pour les requêtes POST.

Si vous voulez approfondir et apprendre d'autres choses intéressantes que vous pouvez faire avec HttpClient, rendez-vous surthe main HttpClient tutorial.

Par défaut, seules les demandes GET aboutissant à une redirection sont automatiquement suivies. Si une demande POST reçoit une réponse avecHTTP 301 Moved Permanently ou avec302 Found -the redirect is not automatically followed.

Ceci est spécifié par lesHTTP RFC 2616:

Si le code d'état 301 est reçu en réponse à une demande autre que GET ou HEAD, l'agent d'utilisateur NE DOIT PAS automatiquement rediriger la demande à moins que l'utilisateur ne puisse le confirmer, car cela pourrait modifier les conditions dans lesquelles la demande a été émise.

Il y a bien sûr des cas d'utilisation où nous devons changer ce comportement et assouplir la spécification HTTP stricte.

Commençons par vérifier le comportement par défaut:

@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));
}

Comme vous pouvez le voir,the redirect is not followed by default, et nous récupérons les301 Status Code.

2. Redirection sur HTTP POST

2.1. Pour HttpClient 4.3 et après

Dans HttpClient 4.3, une API de niveau supérieur a été introduite pour la création et la configuration du client:

@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));
}

Remarquezthe HttpClientBuilder is now the starting point of a fluent API qui permet une configuration complète du client de manière plus lisible qu'auparavant.

2.2. Pour HttpClient 4.2

Dans la version précédente de HttpClient (4.2), nous pouvons configurer la stratégie de redirection directement sur le client:

@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));
}

Notez que maintenant, avec les nouveauxLaxRedirectStrategy, les restrictions HTTP sont assouplies etthe redirect is followed over POST as well - conduisant à un code d'état200 OK.

2.3. Pré HttpClient 4.2

Avant HttpClient 4.2, la classeLaxRedirectStrategy n'existait pas, nous devons donc lancer la nôtre:

@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. Conclusion

Ce guide rapide explique comment configurer n’importe quelle version d’Apache HttpClient 4 pour suivre également les redirections pour les demandes HTTP POST, assouplissant ainsi la norme HTTP stricte.

L'implémentation de tous ces exemples et extraits de codecan be found in my github project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.