Como impedir que o cliente http do apache siga um redirecionamento

Estou me conectando a um servidor remoto com o cliente http do apache. o servidor remoto envia um redirecionamento, e eu quero alcançar que meu cliente não está seguindo o redirecionamento automaticamente para que eu possa extrair o header propper e fazer o que quiser com o alvo.

Eu estou procurando um exemplo de código de trabalho simples (copiar colar) que interrompe o comportamento de redirecionamento automático seguinte .

Eu encontrei impedindo HttpClient 4 de seguir o redirecionamento , mas parece que eu sou muito estúpido para implementá-lo com HttpClient 4.0 (GA)

A implementação padrão do HttpClient é bastante limitada na configurabilidade, mas você pode controlar a manipulação de redirecionamento usando o parâmetro booleano do http.protocol.handle-redirects do HttpClient.

Veja os documentos para referência.

A mágica, graças ao macbirdie , é:

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

As importações são deixadas de fora, aqui está uma amostra de copiar e colar:

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

Isso funcionou para mim:

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

Usando o HttpClient 4.3 e o 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(); 

Em vez de usar diretamente a propriedade, você pode usar:

 final HttpParams params = new BasicHttpParams(); HttpClientParams.setRedirecting(params, false); 
 GetMethod method = new GetMethod(url); method.setFollowRedirects(false); 

Para evitar o header de redirecionamento automático, é necessário primeiro configurar a solicitação para não redirect automaticamente. Você pode fazer isso chamando HttPClientParams.setRedirection e defini-lo como false . O snippet de código é mostrado abaixo:

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

Antes do HttpClient 4.3

Em versões mais antigas do Cliente Http (anteriores a 4.3), podemos configurar o que o cliente faz com os redirecionamentos da seguinte forma:

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

Observe a API alternativa que pode ser usada para configurar o comportamento de redirecionamento sem usar o parâmetro raw.protocol.handle-redirects real bruto:

 HttpClientParams.setRedirecting(params, false); 

Observe também que, com os redirecionamentos de acompanhamento desativados, podemos agora verificar se o código de status da resposta HTTP está de fato 301 movido permanentemente – como deveria ser.

Depois do HttpClient 4.3

O HttpClient 4.3 introduziu uma API mais limpa e de alto nível para construir e configurar o cliente:

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

Observe que a nova API configura todo o cliente com esse comportamento de redirecionamento – não apenas a solicitação individual. Referência: http://www.baeldung.com/httpclient-stop-follow-redirect

em vez de chamar HttpClientBuilder diretamente, você pode usar

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

Para HttURLConnection, eles expuseram uma API. De modo que, se detectar qualquer redirecionamento automático, ele retornará 302 código de resposta em vez de 200. Assim, rastreando o código de resposta, podemos rastrear facilmente se é um URL de redirecionamento ou não.

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

isso funcionou para mim CloseableHttpClient client = HttpClientBuilder.create (). disableRedirectHandling (). build ();

Intereting Posts