Je me connecte à un serveur distant avec le client HTTP Apache. le serveur distant envoie une redirection, et je veux réaliser que mon client ne suit pas la redirection automatiquement afin que je puisse extraire l'en-tête propper et faire ce que je veux avec la cible.
je recherche un exemple de code de travail simple (copier/coller) qui arrête le comportement suivant la redirection automatique.
j'ai trouvé Empêcher HttpClient 4 de suivre la redirection , mais il semble que je suis trop stupide pour l'implémenter avec HttpClient 4.0 (GA)
L'implémentation par défaut HttpClient
est assez limitée en configuration, mais vous pouvez contrôler le traitement des redirections à l'aide du paramètre booléen HttpClient http.protocol.handle-redirects
.
Voir docs pour référence.
La magie, grâce à macbirdie , est:
params.setParameter("http.protocol.handle-redirects",false);
Les importations sont omises, voici un exemple 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.
}
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);
Utiliser 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();
Plutôt que d'utiliser directement la propriété, vous pouvez utiliser:
final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
Avant HttpClient 4.3
Dans les versions antérieures du client HTTP (avant la version 4.3), nous pouvons configurer ce que le client fait avec les redirections 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ée pour configurer le comportement de redirection sans utiliser le paramètre réel http.protocol.handle-redirect brut:
HttpClientParams.setRedirecting(params, false);
Notez également que, avec les redirections de suivi désactivées, nous pouvons maintenant vérifier que le code d'état de la réponse HTTP est bien 301 déplacé de manière permanente - comme il se doit.
Après HttpClient 4.3
HttpClient 4.3 a introduit une API plus propre, plus 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 le client dans son ensemble avec ce comportement de redirection - et pas uniquement la requête individuelle . Référence: http://www.baeldung.com/httpclient-stop-follow-redirect
GetMethod method = new GetMethod(url);
method.setFollowRedirects(false);
Pour éviter l'en-tête de redirection automatique, il faut d'abord configurer la demande pour ne pas faire de redirections automatiques. Vous pouvez le faire en appelant HttPClientParams.setRedirection
et en le définissant sur false
. L'extrait de code est présenté ci-dessous:
HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);
au lieu d'appeler directement HttpClientBuilder, vous pouvez utiliser
HttpClients.custom().disableRedirectHandling().build();
cela a fonctionné pour moi Client CloseableHttpClient = HttpClientBuilder.create (). disableRedirectHandling (). build ();
Pour HttURLConnection, ils ont exposé une api. Ainsi, s'il détecte une redirection automatique, il renvoie 302 codes de réponse au lieu de 200. Ainsi, en suivant le code de réponse, nous pouvons facilement savoir s'il s'agit d'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.