HttpClient 4 - Не следовать перенаправлениям

HttpClient 4 - Не следовать перенаправлениям

1. обзор

В этой статье я покажу, какconfigure the Apache HttpClient 4 to stop following redirects.

По умолчанию, следуя спецификации HTTP,the HttpClient will automatically follow redirects.

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

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

2. Не следовать перенаправлениям

2.1. До HttpClient 4.3

В более старых версиях Http Client (до 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, который можно использовать для настройки поведения перенаправленияwithout using setting the actual raw http.protocol.handle-redirects parameter:

HttpClientParams.setRedirecting(params, false);

Также обратите внимание, что с отключенными последующими перенаправлениями теперь мы можем проверить, что код статуса Http Response действительно301 Moved Permanently - как и должно быть.

2.2. После HttpClient 4.3

HttpClient 4.3 introduced a cleaner, more high level 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 - как pre4.3, так и post - чтобы предотвратить автоматическое выполнение перенаправлений HTTP.

Реализация всех этих примеров и фрагментов кодаcan be found in my github project - это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.