2009-10-05 6 views
39

Ich verbinde mich mit einem Remote-Server mit dem Apache-HTTP-Client. der remote server sendet eine redirect, und ich möchte erreichen, dass mein client die redirect nicht automatisch folgt, so dass ich den propper header extrahieren und machen kann, was ich will mit dem ziel.So verhindern Sie, dass der Apache-HTTP-Client einer Weiterleitung folgt

ich suche nach einem einfachen Arbeitscodeb. (Kopieren und Einfügen) , die die automatische Umleitung stoppt Verhalten nach.

ich fand Preventing HttpClient 4 from following redirect, aber es scheint, ich zu dumm bin, es zu implementieren mit Httpclient 4.0 (GA)

Antwort

16

Die Standard HttpClient Implementierung ziemlich in Konfigurierbarkeit begrenzt ist, aber Sie können die Umleitung Umgang steuern, indem Httpclient des boolean mit Parameter http.protocol.handle-redirects.

Siehe docs als Referenz.

+2

ein einfaches Beispiel hierfür (http://www.baeldung.com/httpclient-stop-follow-redirect) –

+0

Ab 4.3 diese Antwort ist veraltet Antwort Verwendung Verwendung von David [Hier finden Sie] Riccitelli – DSchmidt

45

Die Magie dank macbirdie ist:

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

Importe werden weggelassen, hier ist eine Kopie Paste Beispiel:

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

Arbeitete wie ein Charme ... :) – Rajan

+2

das ist veraltete Verwendung Antwort von David Riccitelli – enisher

13

Anstatt die Eigenschaft direkt können Sie:

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

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

23

Dies funktionierte für mich:

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

Arbeitete für mich perfekt und benötigt nur minimale Änderungen im Code. Vielen Dank. –

+0

hat gut für mich gearbeitet –

+0

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

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

automatische Umleitung-Header zu vermeiden, muss man zuerst die Anforderung konfiguriert nicht automatisch Umleitungen zu tun. Sie können dies tun, indem Sie HttPClientParams.setRedirection aufrufen und es auf false setzen. Code-Schnipsel ist unten dargestellt:

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

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

20

Mit Httpclient 4.3 und 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

Relevante Informationen: 'HttpClientBuilder.create(). disableRedirectHandling(). build();' –

0

statt Anruf HttpClientBuilder direkt, können Sie

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

Vor Httpclient 4.3

In älteren Versionen der Http C lient (vor 4.3), können wir konfigurieren, was der Kunde hat mit Umleitungen wie folgt:

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

Beachten Sie die alternative API, die verwendet werden können, die Umleitung Verhalten ohne Setzen des tatsächlichen Roh http.protocol.handle konfigurieren -redirects Parameter:

HttpClientParams.setRedirecting(params, false); 

Beachten sie auch, dass mit Folge deaktiviert umleitet, können wir jetzt prüfen, ob der HTTP-Antwortstatuscode in der Tat 301 dauerhaft verschoben ist - wie es sein sollte.

Nach Httpclient 4,3

Httpclient 4.3 eingeführt einem sauberen, mehr High Level-API zu bauen und konfigurieren Sie den Client:

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

Beachten Sie, dass die neue API den gesamten Client mit dieser konfiguriert Redirect-Verhalten - nicht nur die individuelle Anfrage. Referenz: http://www.baeldung.com/httpclient-stop-follow-redirect

0

Für HttURLConnection haben sie eine API freigelegt. Wenn also eine automatische Umleitung erkannt wird, gibt es 302 Antwortcode statt 200 zurück. So können wir durch Verfolgung des Antwortcodes leicht verfolgen, ob es sich um eine Weiterleitungs-URL handelt oder nicht.

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