Перейти к основному содержимому

Apache HttpClient — не следовать перенаправлениям

· 2 мин. чтения

1. Обзор

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

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

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

Если вы хотите копнуть глубже и узнать о других интересных вещах, которые можно делать с помощью 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, который можно использовать для настройки поведения перенаправления без использования установки фактического необработанного параметра http.protocol.handle-redirects :

HttpClientParams.setRedirecting(params, false);

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

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 , так и после — чтобы он не выполнял автоматические перенаправления HTTP.

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