proyectos ejemplos java apache-httpclient-4.x

java - ejemplos - django



Cómo evitar que el cliente http de apache siga una redirección (11)

Me estoy conectando a un servidor remoto con el cliente http de apache. el servidor remoto envía una redirección, y quiero lograr que mi cliente no siga la redirección automáticamente para poder extraer el encabezado correcto y hacer lo que quiera con el objetivo.

Estoy buscando un ejemplo simple de código de trabajo (copiar y pegar) que detenga el comportamiento de seguimiento de redireccionamiento automático .

Encontré Evitar que HttpClient 4 siga el redireccionamiento , pero parece que soy demasiado estúpido para implementarlo con HttpClient 4.0 (GA)


En lugar de usar la propiedad directamente, puedes usar:

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


Esto funcionó para mí:

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


La magia, gracias a , es:

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

Las importaciones se quedan fuera, aquí hay una copia de muestra de pegar:

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


Para HttURLConnection han expuesto una api. De modo que, si detecta cualquier redireccionamiento automático, devolverá 302 códigos de respuesta en lugar de 200. De modo que, al rastrear el código de respuesta, podemos rastrear fácilmente que es una URL de redirección o no.

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


Para evitar el encabezado de redirección automática, primero debe configurar la solicitud para que no realice redirecciones automáticas. Puede hacerlo llamando a HttPClientParams.setRedirection y configurándolo en false . El fragmento de código se muestra a continuación:

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


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


en lugar de llamar directamente a HttpClientBuilder, puede usar

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


esto funcionó para mi cliente CloseableHttpClient = HttpClientBuilder.create (). disableRedirectHandling (). build ();


Antes de HttpClient 4.3

En versiones anteriores del Cliente Http (antes de 4.3), podemos configurar lo que el cliente hace con las redirecciones de la siguiente manera:

@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 la API alternativa que se puede usar para configurar el comportamiento de redireccionamiento sin usar la configuración del parámetro http.protocol.handle-redirects sin procesar real:

HttpClientParams.setRedirecting(params, false);

También tenga en cuenta que, con las redirecciones de seguimiento deshabilitadas, ahora podemos verificar que el código de estado de Respuesta a HTTP sea 301 Movido permanentemente, como debería ser.

Después de HttpClient 4.3

HttpClient 4.3 introdujo una API más limpia y de más alto nivel para crear y configurar el 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)); }

Tenga en cuenta que la nueva API configura todo el cliente con este comportamiento de redireccionamiento, no solo la solicitud individual. Referencia: http://www.baeldung.com/httpclient-stop-follow-redirect


La implementación predeterminada de HttpClient es bastante limitada en configuración, pero puede controlar el manejo de redireccionamiento utilizando el parámetro booleano de HttpClient http.protocol.handle-redirects .

Ver los docs para referencia.


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