2009-10-05 10 views
39

Je me connecte à un serveur distant avec un client http apache. le serveur distant envoie une redirection, et je veux réaliser que mon client ne suit pas la redirection automatiquement de sorte que je puisse extraire l'en-tête de propper et faire ce que je veux avec la cible.Comment empêcher le client http apache de suivre une redirection

je suis à la recherche d'un exemple simple de code de travail (copier coller) qui arrête la redirection automatique comportement suivant.

i trouvé Preventing HttpClient 4 from following redirect, mais il semble que je suis trop bête pour la mettre en œuvre avec HttpClient 4.0 (GA)

Répondre

16

La valeur par défaut HttpClient mise en œuvre est assez limité dans configurabilité, mais vous pouvez contrôler la redirection manipulation en utilisant le booléen de HttpClient paramètre http.protocol.handle-redirects. Voir le docs pour référence.

+2

un exemple simple de ce [se trouvent ici] (http://www.baeldung.com/httpclient-stop-follow-redirect) –

+0

Au 4.3 cette réponse est déconseillée, l'utilisation par David utilisation réponse Riccitelli – DSchmidt

45

La magie, grâce à macbirdie, est:

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

Les importations sont laissés, voici un échantillon de copier coller:

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

A fonctionné comme un charme ... :) – Rajan

+2

ceci est obsolète utiliser la réponse par David Riccitelli – enisher

13

Plutôt que d'utiliser la propriété que vous pouvez directement utiliser:

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

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

23

Cela a fonctionné pour moi:

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

A travaillé pour moi parfaitement et avait seulement besoin de changements minimes dans le code. Merci. –

+0

a bien fonctionné pour moi –

+0

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

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

Pour éviter en-tête de redirection automatique, il faut d'abord configurer la demande de ne pas faire redirections automatiques. Pour ce faire, appelez le HttPClientParams.setRedirection et réglez-le sur false. extrait de code ci-dessous:

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

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

20

En utilisant HttpClient 4.3 et 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

Informations pertinentes: 'HttpClientBuilder.create(). disableRedirectHandling(). build();' –

0

au lieu d'appel HttpClientBuilder directement, vous pouvez utiliser

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

Avant HttpClient 4.3

Dans les anciennes versions du Http C LIENT (avant 4.3), nous pouvons configurer ce que le client fait avec réoriente comme suit:

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

Notez l'API alternative qui peut être utilisé pour configurer le comportement de redirection sans utiliser le réglage de la http.protocol.handle brute réelle -redirects paramètre:

HttpClientParams.setRedirecting(params, false); 

notez également que, avec suivi réoriente personnes handicapées, nous pouvons maintenant vérifier que le code d'état de réponse Http est en effet 301 déplacé définitivement - comme cela devrait être.

Après HttpClient 4.3

HttpClient 4.3 introduit un produit de nettoyage, plus API de haut niveau pour construire et configurer le 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)); 
} 

Notez que la nouvelle API configure l'ensemble client avec ce rediriger le comportement - pas seulement la demande individuelle. Référence: http://www.baeldung.com/httpclient-stop-follow-redirect

0

Pour HttURLConnection, ils ont exposé une API. Donc, si elle détecte une redirection automatique, elle renverra le code de réponse 302 au lieu de 200. Ainsi, en suivant le code de réponse, nous pouvons facilement savoir si c'est une URL de redirection ou non.

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