HttpClient 4 - Segui i reindirizzamenti per POST

1. Panoramica

Questo breve tutorial mostrerà come configurare Apache HttpClient 4 per seguire automaticamente i reindirizzamenti per le richieste POST.

Se vuoi approfondire e imparare altre cose interessanti che puoi fare con HttpClient, vai al tutorial principale di HttpClient .

Per impostazione predefinita, vengono seguite automaticamente solo le richieste GET che comportano un reindirizzamento. Se una richiesta POST riceve risposta con HTTP 301 spostato in modo permanente o con 302 trovato , il reindirizzamento non viene seguito automaticamente .

Questo è specificato da HTTP RFC 2616:

Se il codice di stato 301 viene ricevuto in risposta a una richiesta diversa da GET o HEAD, l'agente utente NON DEVE reindirizzare automaticamente la richiesta a meno che non possa essere confermata dall'utente, poiché ciò potrebbe modificare le condizioni in base alle quali è stata emessa la richiesta.

Ci sono ovviamente casi d'uso in cui dobbiamo cambiare quel comportamento e allentare le rigide specifiche HTTP.

Innanzitutto, controlliamo il comportamento predefinito:

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

Come puoi vedere, il reindirizzamento non è seguito per impostazione predefinita e otteniamo il codice di stato 301 .

2. Reindirizzamento su HTTP POST

2.1. Per HttpClient 4.3 e versioni successive

In HttpClient 4.3, è stata introdotta un'API di livello superiore sia per la creazione che per la configurazione del 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)); }

Si noti la HttpClientBuilder è ora il punto di partenza di un'API fluente , che consente la completa configurazione del client in modo più leggibile rispetto a prima.

2.2. Per HttpClient 4.2

Nella precedente versione di HttpClient (4.2) possiamo configurare la strategia di reindirizzamento direttamente sul 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)); }

Si noti che ora, con il nuovo LaxRedirectStrategy , le restrizioni HTTP sono allentate e il reindirizzamento viene seguito anche sul POST, portando a un codice di stato 200 OK .

2.3. Pre HttpClient 4.2

Prima di HttpClient 4.2, la classe LaxRedirectStrategy non esisteva, quindi dobbiamo eseguire il rollio:

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

Questa guida rapida ha illustrato come configurare qualsiasi versione di Apache HttpClient 4 per seguire i reindirizzamenti anche per le richieste HTTP POST, allentando lo standard HTTP rigoroso.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel mio progetto GitHub : questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.