2009-10-05 12 views
39

Łączę się ze zdalnym serwerem z klientem http apache. serwer zdalny wysyła przekierowanie i chcę osiągnąć, że mój klient nie śledzi automatycznie przekierowania, więc mogę wyodrębnić nagłówek proppera i zrobić, co chcę z celem.Jak uniemożliwić klientowi apache http od następującego przekierowania

ja szukam prosty przykładowy kod roboczych (Kopiuj Wklej) który zatrzymuje automatyczne przekierowanie następujące zachowanie.

znalazłem Preventing HttpClient 4 from following redirect, ale wydaje się, że jestem zbyt głupi, aby wdrożyć go z HttpClient 4.0 (GA)

Odpowiedz

16

Wdrożenie domyślne HttpClient jest dość ograniczone możliwości konfiguracji, ale można kontrolować przekierowanie obsługi za pomocą httpclient na wartość logiczną parametr http.protocol.handle-redirects.

Patrz: docs w celach informacyjnych.

+2

prostym przykładem [można znaleźć tutaj] (http://www.baeldung.com/httpclient-stop-follow-redirect) –

+0

Od 4,3 Ta odpowiedź jest przestarzała, ZASTOSOWANIE odpowiedź przez Dawida Riccitelli – DSchmidt

45

Magia, dzięki macbirdie jest:

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

Imports są opuszczone, oto próbka pasty kopia:

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

Pracował jak czar ... :) – Rajan

+2

ta jest przestarzała użycie odpowiedź David Riccitelli – enisher

13

Zamiast korzystać z nieruchomości bezpośrednio można użyć:

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

'HttpClientParams' @deprecated (4,3) używać {@link org.apache.http.client.config.RequestConfig} –

23

To zadziałało dla mnie:

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

pracował dla mnie idealnie i potrzebował tylko minimalnych zmian w kodzie. Dzięki. –

+0

Udało mi się dobrze –

+0

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

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

Aby uniknąć automatycznego nagłówek przekierowania, trzeba najpierw skonfigurować żądanie nie dokonuje automatycznego przekierowania. Możesz to zrobić, dzwoniąc pod numer HttPClientParams.setRedirection i ustawiając go na false. Fragment kodu jest pokazany poniżej:

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

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

20

Korzystanie httpclient 4.3 i 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(); 
+0

Informacje istotne: 'HttpClientBuilder.create(). disableRedirectHandling(). build();' –

0

zamiast rozmowy HttpClientBuilder bezpośrednio, można użyć

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

Przed HttpClient 4.3

W starszych wersjach Http C lient (przed 4.3), możemy skonfigurować, co klient robi z przekierowań w następujący sposób:

@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)); 
} 

zauważy alternatywa API, które mogą być używane do konfigurowania zachowania przekierowania bez użycia ustalające rzeczywistą surowego http.protocol.handle -redirects parametr:

HttpClientParams.setRedirecting(params, false); 

zauważyć również, że z przekierowań niepełnosprawnych, możemy teraz sprawdzić, że kod stanu HTTP Response to rzeczywiście 301 Przeniesiono na stałe - tak jak powinno być.

Po HttpClient 4.3

HttpClient 4.3 wprowadzono czystsze, bardziej wysoki poziom API zbudować i skonfigurować klienta:

@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)); 
} 

Zauważ, że nowy API konfiguruje całą klientowi to zachowanie przekierowania - nie tylko indywidualne żądanie. Odwołanie: http://www.baeldung.com/httpclient-stop-follow-redirect

0

W przypadku połączenia HttURLCl mają one widoczne api. Tak więc, jeśli wykryje jakiekolwiek automatyczne przekierowanie, zwróci kod odpowiedzi 302 zamiast 200. Tak więc przez śledzący kod odpowiedzi możemy łatwo śledzić, czy jest to adres URL przekierowania, czy nie.

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