HttpClient 4 - Seguir redirecionamentos para o POST

HttpClient 4 - Seguir redirecionamentos para o POST

1. Visão geral

Este tutorial rápido mostrará como configurar o Apache HttpClient 4 para seguir automaticamente os redirecionamentos para solicitações POST.

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

Por padrão, apenas as solicitações GET que resultam em um redirecionamento são seguidas automaticamente. Se uma solicitação POST for respondida comHTTP 301 Moved Permanently ou com302 Found -the redirect is not automatically followed.

Isso é especificado porHTTP RFC 2616:

Se o código de status 301 for recebido em resposta a uma solicitação que não seja GET ou HEAD, o agente do usuário NÃO DEVE redirecionar automaticamente a solicitação, a menos que possa ser confirmada pelo usuário, pois isso pode alterar as condições sob as quais a solicitação foi emitida.

É claro que existem casos em que precisamos alterar esse comportamento e relaxar a especificação HTTP rigorosa.

Primeiro, vamos verificar o comportamento padrão:

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

Como você pode ver,the redirect is not followed by default, e recebemos de volta301 Status Code.

2. Redirecionando em HTTP POST

2.1. Para HttpClient 4.3 e posterior

No HttpClient 4.3, uma API de nível superior foi introduzida para criação e configuração do cliente:

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

Observethe HttpClientBuilder is now the starting point of a fluent API que permite a configuração completa do cliente de uma forma mais legível do que antes.

2.2. Para HttpClient 4.2

Na versão anterior do HttpClient (4.2), podemos configurar a estratégia de redirecionamento diretamente no cliente:

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

Observe que agora, com o novoLaxRedirectStrategy, as restrições de HTTP foram relaxadas ethe redirect is followed over POST as well - levando a um código de status200 OK.

2.3. Pre HttpClient 4.2

Antes do HttpClient 4.2, a classeLaxRedirectStrategy não existia, então precisamos lançar a nossa própria:

@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. Conclusão

Este guia rápido ilustrou como configurar qualquer versão do Apache HttpClient 4 para seguir também os redirecionamentos para solicitações HTTP POST - relaxando o rigoroso padrão HTTP.

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á.