2009-10-05 5 views
39

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

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

я нашел Preventing HttpClient 4 from following redirect, но, кажется, я слишком глуп, чтобы реализовать его с HttpClient 4,0 (GA)

ответ

16

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

См. docs для справки.

+2

простой пример этого [можно найти здесь] (http://www.baeldung.com/httpclient-stop-follow-redirect) –

+0

На 4.3 этот ответ является устаревшим, используйте использовать ответ Давида Riccitelli – DSchmidt

45

Магия, благодаря macbirdie, является:

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

Imports опущены, вот копия пасты образец:

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. 
} 
+0

Работал как шарм ... :) – Rajan

+2

Это устаревшее использование ответа Дэвида Риккителли – enisher

13

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

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

'HttpClientParams' @deprecated (4.3) use {@link org.apache.http.client.config.RequestConfig} –

23

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

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

Работал для меня отлично и потребовались только минимальные изменения в коде. Благодарю. –

+0

работал отлично для меня –

+0

'httpGet.getParams()' @deprecated (4.3) use {@link org.apache.http.client.config.RequestConfig} –

1

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

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

'HttpClientParams.setRedirecting' @deprecated (4.3) use {@link org .apache.http.client.config.RequestConfig} –

20

Использование HttpClient 4.3 и свободный:

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(); 
+0

Дополнительная информация: 'HttpClientBuilder.create(). disableRedirectHandling(). build();' –

0

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

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

Перед HttpClient 4,3

В старых версиях Http C lient (до 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 Moved постоянно - как это должно быть.

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

0

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