Подтвердить что ты не робот

Как предотвратить клиент http-apache от перенаправления

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

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

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

4b9b3361

Ответ 1

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

Обратитесь к docs для справки.

Ответ 2

Магия, благодаря 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.
}

Ответ 3

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

HttpGet httpGet = new HttpGet("www.google.com");
HttpParams params = httpGet.getParams();
params.setParameter(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE);
httpGet.setParams(params);

Ответ 4

Использование 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();

Ответ 5

Вместо использования этого свойства вы можете использовать:

final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);

Ответ 6

GetMethod method = new GetMethod(url);
method.setFollowRedirects(false); 

Ответ 7

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

HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);

Ответ 8

До 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:/testabc.com");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);

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

Обратите внимание на альтернативный API, который можно использовать для настройки поведения переадресации без использования установки параметра raw 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

Ответ 9

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

HttpClients.custom().disableRedirectHandling().build();

Ответ 10

Для 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.