Рубрики
Без рубрики

HttpClient 4 – Не Следовать Перенаправлениям

Остановите Apache HttpClient 4 автоматически после редиректов – Придет день, когда редиректы будут следовать, но это не ЭТОТ ДЕНЬ!

Автор оригинала: Eugen Paraschiv.

1. Обзор

В этой статье я покажу, как настроить Apache HttpClient 4, чтобы остановить следующие редиректы .

По умолчанию, следуя спецификации HTTP, HttpClient будет автоматически следовать перенаправлениям .

Для некоторых usecases это может быть совершенно нормально, но есть, конечно, usecases, где это нежелательно – и теперь мы рассмотрим, как изменить это поведение по умолчанию и прекратить следовать перенаправлениям .

Если вы хотите копнуть глубже и узнать другие интересные вещи, которые вы можете сделать с HttpClient – перейдите к основному учебнику HttpClient .

2. Не Следуйте Перенаправлениям

2.1. Перед HttpClient 4.3

В более старых версиях Http-клиента (до версии 4.3) мы можем настроить то, что клиент делает с перенаправлениями следующим образом:

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

Обратите внимание на альтернативный API, который можно использовать для настройки поведения перенаправления без использования установки фактического raw http.protocol.handle-redirects parameter :

HttpClientParams.setRedirecting(params, false);

Также обратите внимание, что при отключенных последующих перенаправлениях мы теперь можем проверить, что код состояния Http – ответа действительно 301 Перемещен навсегда – как и должно быть.

2.2. После HttpClient 4.3

HttpClient 4.3 представил более чистый и высокоуровневый API для сборки и настройки клиента:

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

Обратите внимание, что новый API настраивает весь клиент с таким поведением перенаправления, а не только отдельный запрос.

3. Заключение

В этом кратком руководстве рассказывается о том, как настроить Apache HttpClient – оба предварительно 4.3 и post – чтобы он не следовал за HTTP-перенаправлениями автоматически.

Реализацию всех этих примеров и фрагментов кода можно найти в моем проекте github – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.