Как запретить http-клиенту apache следовать перенаправлению

Я подключаюсь к удаленному серверу с помощью http-клиента apache. удаленный сервер отправляет перенаправление, и я хочу добиться того, чтобы мой клиент не выполнял перенаправление автоматически, чтобы я мог извлечь соответствующий заголовок и делать с целью все, что захочу.

я ищу пример простого рабочего кода (скопируйте и вставьте), который останавливает поведение автоматической переадресации.

я нашел предотвращение перенаправления HttpClient 4, но, похоже, я слишком глупо реализовать это с помощью HttpClient 4.0 (GA)


person Chris    schedule 05.10.2009    source источник


Ответы (10)


Реализация HttpClient по умолчанию довольно ограничена в настройке, но вы можете управлять обработкой перенаправления с помощью логического параметра http.protocol.handle-redirects HttpClient.

Для справки см. документы.

person macbirdie    schedule 05.10.2009
comment
простой пример этого можно найти здесь - person TheWestIsThe...; 09.06.2014
comment
Начиная с версии 4.3 этот ответ устарел, используйте ответ Дэвида Ричителли. - person DSchmidt; 26.06.2016
comment
@DSchmidt, новый API настраивает весь клиент с таким поведением перенаправления, а не только отдельный запрос. Я хочу, чтобы мой клиент отключил отдельный запрос, и это достижимо с помощью API до 4.3. - person Fan Jin; 26.07.2018
comment
не это, а ответ Дэвида Ритичелли - это текущее (›= 4.3) правильное решение: stackoverflow.com/a/21560006/1915920 - person Andreas Covidiot; 22.06.2020

Волшебство, благодаря macbirdie , заключается в следующем:

params.setParameter("http.protocol.handle-redirects",false);

Импорт не учитывается, вот пример копирования и вставки:

HttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();

// HTTP parameters stores header etc.
HttpParams params = new BasicHttpParams();
params.setParameter("http.protocol.handle-redirects",false);

// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();

// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

// connect and receive 
HttpGet httpget = new HttpGet("http://localhost/web/redirect");
httpget.setParams(params);
response = httpclient.execute(httpget, localContext);

// obtain redirect target
Header locationHeader = response.getFirstHeader("location");
if (locationHeader != null) {
    redirectLocation = locationHeader.getValue();
  System.out.println("loaction: " + redirectLocation);
} else {
  // The response is invalid and did not provide the new location for
  // the resource.  Report an error or possibly handle the response
  // like a 404 Not Found error.
}
person Chris    schedule 05.10.2009
comment
это устаревший ответ Дэвида Ричителли - person enisher; 27.05.2015

Использование HttpClient 4.3 и Fluent:

final String url = "http://...";
final HttpClient client = HttpClientBuilder.create()
    .disableRedirectHandling()
    .build();
final Executor executor = Executor.newInstance(client);
final HttpResponse response = executor.execute(Request.Get(url))
    .returnResponse();
person David Riccitelli    schedule 04.02.2014
comment
Соответствующая информация: HttpClientBuilder.create().disableRedirectHandling().build(); - person Nick Grealy; 06.05.2016
comment
Эй, хороший ответ. Есть ли способ отключить перенаправление для одного конкретного запроса? Это достижимо через request.setParams, но я не знаю, как это сделать в версии httpclient после 4.3. - person Fan Jin; 26.07.2018
comment
Хочу сделать то же самое, что и @FanJin. Кто-нибудь может дать ответ на его вопрос? - person birgersp; 15.01.2019

Это сработало для меня:

HttpGet httpGet = new HttpGet("www.google.com");
HttpParams params = httpGet.getParams();
params.setParameter(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE);
httpGet.setParams(params);
person Caner    schedule 09.11.2011
comment
У меня работало отлично и требовало лишь минимальных изменений в коде. Спасибо. - person Szilard Barany; 15.05.2012
comment
httpGet.getParams() @deprecated (4.3) используйте {@link org.apache.http.client.config.RequestConfig} - person Nick Grealy; 06.05.2016

Вместо того, чтобы использовать свойство напрямую, вы можете использовать:

final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
person David Koski    schedule 15.11.2009
comment
HttpClientParams @deprecated (4.3) используйте {@link org.apache.http.client.config.RequestConfig} - person Nick Grealy; 06.05.2016

До 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:/testabc.com");
    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 — как и должно быть.

После 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://testabc.com"));

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

Обратите внимание, что новый API настраивает такое поведение перенаправления для всего клиента, а не только для отдельного запроса. Ссылка: http://www.baeldung.com/httpclient-stop-follow-redirect< /а>

person Fan Jin    schedule 26.03.2017

это сработало для меня CloseableHttpClient client = HttpClientBuilder.create().disableRedirectHandling().build()

person Pravin Bansal    schedule 11.03.2018

Чтобы избежать автоматического заголовка перенаправления, необходимо сначала настроить запрос, чтобы он не выполнял автоматические перенаправления. Вы можете сделать это, вызвав HttPClientParams.setRedirection и установив его на false. Фрагмент кода показан ниже:

HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);
person Simple-Solution    schedule 18.04.2013
comment
HttpClientParams.setRedirecting @deprecated (4.3) используйте {@link org.apache.http.client.config.RequestConfig} - person Nick Grealy; 06.05.2016

вместо прямого вызова HttpClientBuilder вы можете использовать

HttpClients.custom().disableRedirectHandling().build();
person liuck8080    schedule 10.05.2016
comment
почему это будет лучше? - person Andreas Covidiot; 22.06.2020

person    schedule
comment
по крайней мере, в v4.5.2 больше нет GetMethod, но он был в v3: https://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/методы/GetMethod.html - person Andreas Covidiot; 22.06.2020