Как запретить http-клиенту Apache выполнять перенаправление - PullRequest
41 голосов
/ 05 октября 2009

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

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

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

Ответы [ 11 ]

49 голосов
/ 05 октября 2009

Магия, благодаря 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.
}
24 голосов
/ 04 февраля 2014

Использование 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();
24 голосов
/ 09 ноября 2011

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

HttpGet httpGet = new HttpGet("www.google.com");
HttpParams params = httpGet.getParams();
params.setParameter(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE);
httpGet.setParams(params);
17 голосов
/ 05 октября 2009

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

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

13 голосов
/ 15 ноября 2009

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

final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
1 голос
/ 26 марта 2017

До 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 301 перемещен навсегда - как и должно быть.

После 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

1 голос
/ 18 апреля 2013

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

HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);
1 голос
/ 16 февраля 2012
GetMethod method = new GetMethod(url);
method.setFollowRedirects(false); 
0 голосов
/ 11 марта 2018

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

0 голосов
/ 10 мая 2017

Для HttURLConnection они выставили API. Таким образом, если он обнаружит какое-либо автоматическое перенаправление, он вернет код ответа 302 вместо 200. Таким образом, отслеживая код ответа, мы можем легко отследить, является ли это URL-адрес перенаправления или нет.

HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL("http://www.redirecturl.com").openConnection());
httpURLConnection.setInstanceFollowRedirects(false);
httpURLConnection.connect();
int responseCode = httpURLConnection.getResponseCode(); //302 in case of redirection.
...