HttpClient 4 - Suivez les redirections pour POST

1. Vue d'ensemble

Ce tutoriel rapide montrera comment configurer Apache HttpClient 4 pour suivre automatiquement les redirections pour les requêtes POST.

Si vous souhaitez approfondir et apprendre d'autres choses intéressantes que vous pouvez faire avec HttpClient, rendez-vous au didacticiel principal HttpClient .

Par défaut, seules les requêtes GET entraînant une redirection sont automatiquement suivies. Si une demande POST reçoit une réponse avec HTTP 301 déplacé définitivement ou avec 302 détecté , la redirection n'est pas automatiquement suivie .

Ceci est spécifié par le HTTP RFC 2616:

Si le code d'état 301 est reçu en réponse à une demande autre que GET ou HEAD, l'agent utilisateur NE DOIT PAS rediriger automatiquement la demande à moins qu'elle ne puisse être confirmée par l'utilisateur, car cela pourrait changer 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("//t.co/I5YYd9tddw")); assertThat(response.getStatusLine().getStatusCode(), equalTo(301)); }

Comme vous pouvez le voir, la redirection n'est pas suivie par défaut et nous récupérons le code d'état 301 .

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

Notez que HttpClientBuilder est maintenant le point de départ d'une API fluide qui permet une configuration complète du client d'une 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("//t.co/I5YYd9tddw")); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

Notez que maintenant, avec la nouvelle LaxRedirectStrategy , les restrictions HTTP sont assouplies et la redirection est également suivie sur POST - conduisant à un code d'état 200 OK .

2.3. Pré HttpClient 4.2

Avant HttpClient 4.2, la classe LaxRedirectStrategy 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("//t.co/I5YYd9tddw")); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

3. Conclusion

Ce guide rapide a illustré comment configurer n'importe quelle version d'Apache HttpClient 4 pour suivre également les redirections pour les requêtes HTTP POST, en assouplissant la norme HTTP stricte.

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans mon projet github - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.