Автор оригинала: 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, поэтому его должно быть легко импортировать и запускать как есть.