HttpClient 4 - Não siga redirecionamentos

HttpClient 4 - Não siga redirecionamentos

1. Visão geral

Neste artigo, vou mostrar comoconfigure the Apache HttpClient 4 to stop following redirects.

Por padrão, seguindo a especificação HTTP,the HttpClient will automatically follow redirects.

Para alguns casos de uso, isso pode ser perfeitamente adequado, mas certamente existem casos de uso em que isso não é desejado - e agora veremos como alterar esse comportamento padrão estop following redirects.

Se você quiser se aprofundar e aprender outras coisas legais que você pode fazer com o HttpClient - vá parathe main HttpClient tutorial.

2. Não siga redirecionamentos

2.1. Antes do HttpClient 4.3

Nas versões mais antigas do cliente Http (antes da versão 4.3), podemos configurar o que o cliente faz com os redirecionamentos da seguinte maneira:

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected()
  throws ClientProtocolException, IOException {
    DefaultHttpClient instance = new DefaultHttpClient();

    HttpParams params = new BasicHttpParams();
    params.setParameter(ClientPNames.HANDLE_REDIRECTS, false);
    // HttpClientParams.setRedirecting(params, false); // alternative

    HttpGet httpGet = new HttpGet("http://t.co/I5YYd9tddw");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

Observe a API alternativa que pode ser usada para configurar o comportamento de redirecionamentowithout using setting the actual raw http.protocol.handle-redirects parameter:

HttpClientParams.setRedirecting(params, false);

Observe também que, com os redirecionamentos de seguimento desabilitados, podemos verificar se o código de status da Resposta Http é realmente301 Moved Permanently - como deveria ser.

2.2. Após HttpClient 4.3

HttpClient 4.3 introduced a cleaner, more high level API para construir e configurar o cliente:

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected()
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClientBuilder.create().disableRedirectHandling().build();
    HttpResponse response = instance.execute(new HttpGet("http://t.co/I5YYd9tddw"));

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

Observe que a nova API configura o cliente inteiro com esse comportamento de redirecionamento - não apenas a solicitação individual.

3. Conclusão

Este tutorial rápido cobriu como configurar o Apache HttpClient - tanto pré4.3e pós - para evitar que siga redirecionamentos HTTP automaticamente.

A implementação de todos esses exemplos e fragmentos de códigocan be found in my github project - este é um projeto baseado no Eclipse, portanto, deve ser fácil de importar e executar como está.