org libreria httppost example ejemplo java httpclient

libreria - login httpclient java



Manejo de HttpClient Redirects (4)

Estoy PUBLICANDO algunos datos a un servidor que está respondiendo un 302 Movido temporalmente.

Quiero que HttpClient siga la redirección y OBTENGA automáticamente la nueva ubicación, ya que creo que es el comportamiento predeterminado de HttpClient. Sin embargo, recibo una excepción y no sigo la redirección :(

Aquí está la pieza relevante de código, se apreciará cualquier idea:

HttpParams httpParams = new BasicHttpParams(); HttpClientParams.setRedirecting(httpParams, true); SchemeRegistry schemeRegistry = registerFactories(); ClientConnectionManager clientConnectionManager = new ThreadSafeClientConnManager(httpParams, schemeRegistry); HttpClient httpClient = new DefaultHttpClient(clientConnectionManager, httpParams) HttpPost postRequest = new HttpPost(url); postRequest.setHeader(HTTP.CONTENT_TYPE, contentType); postRequest.setHeader(ACCEPT, contentType); if (requestBodyString != null) { postRequest.setEntity(new StringEntity(requestBodyString)); } return httpClient.execute(postRequest, responseHandler);


El comportamiento predeterminado de HttpClient es compatible con los requisitos de la especificación HTTP (RFC 2616)

10.3.3 302 Found ... If the 302 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

Puede anular el comportamiento predeterminado de HttpClient subclasificando DefaultRedirectStrategy y anulando su método #isRedirected ().


Mi solución es usar HttClient. Tuve que enviar la respuesta a la persona que llama. Esta es mi solución

CloseableHttpClient httpClient = HttpClients.custom() .setRedirectStrategy(new LaxRedirectStrategy()) .build(); //this reads the input stream from POST ServletInputStream str = request.getInputStream(); HttpPost httpPost = new HttpPost(path); HttpEntity postParams = new InputStreamEntity(str); httpPost.setEntity(postParams); HttpResponse httpResponse = null ; int responseCode = -1 ; StringBuffer response = new StringBuffer(); try { httpResponse = httpClient.execute(httpPost); responseCode = httpResponse.getStatusLine().getStatusCode(); logger.info("POST Response Status:: {} for file {} ", responseCode, request.getQueryString()); //return httpResponse ; BufferedReader reader = new BufferedReader(new InputStreamReader( httpResponse.getEntity().getContent())); String inputLine; while ((inputLine = reader.readLine()) != null) { response.append(inputLine); } reader.close(); logger.info(" Final Complete Response {} " + response.toString()); httpClient.close(); } catch (Exception e) { logger.error("Exception ", e); } finally { IOUtils.closeQuietly(httpClient); } // Return the response back to caller return new ResponseEntity<String>(response.toString(), HttpStatus.ACCEPTED);


Para HttpClient 4.3 :

HttpClient instance = HttpClientBuilder.create() .setRedirectStrategy(new LaxRedirectStrategy()).build();

Para HttpClient 4.2 :

DefaultHttpClient client = new DefaultHttpClient(); client.setRedirectStrategy(new LaxRedirectStrategy());

Para HttpClient <4.2 :

DefaultHttpClient client = new DefaultHttpClient(); client.setRedirectStrategy(new DefaultRedirectStrategy() { /** Redirectable methods. */ private String[] REDIRECT_METHODS = new String[] { HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME }; @Override protected boolean isRedirectable(String method) { for (String m : REDIRECT_METHODS) { if (m.equalsIgnoreCase(method)) { return true; } } return false; } });


Parece que http redirect está deshabilitado por defecto. Intento habilitar, funciona, pero sigo teniendo un error con mi problema. Pero aún podemos manejar la redirección de forma pragmática. Creo que tu problema puede resolverlo: código tan antiguo:

AndroidHttpClient httpClient = AndroidHttpClient.newInstance("User-Agent"); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); long contentSize = httpResponse.getEntity().getContentLength();

Este código devolverá contentSize = -1 si se redirigió http

Y luego manejo la redirección por mí mismo después de intentar habilitar la redirección de seguimiento predeterminada

AndroidHttpClient client; HttpGet httpGet; HttpResponse response; HttpHeader httpHeader; private void handleHTTPRedirect(String url) throws IOException { if (client != null) client.close(); client = AndroidHttpClient.newInstance("User-Agent"); httpGet = new HttpGet(Network.encodeUrl(url)); response = client.execute(httpGet); httpHeader = response.getHeaders("Location"); while (httpHeader.length > 0) { client.close(); client = AndroidHttpClient.newInstance("User-Agent"); httpGet = new HttpGet(Network.encodeUrl(httpHeader[0].getValue())); response = client.execute(httpGet); httpHeader = response.getHeaders("Location"); } }

En uso

handleHTTPRedirect(url); long contentSize = httpResponse.getEntity().getContentLength();

Gracias Nguyen