Gerenciando Redirecionamentos do HttpClient

Estou postando alguns dados para um servidor que está respondendo a um 302 movido temporariamente.

Eu quero HttpClient para seguir o redirecionamento e obter automaticamente o novo local, pois acredito que é o comportamento padrão do HttpClient. No entanto, estou recebendo uma exceção e não seguindo o redirecionamento 🙁

Aqui está a parte relevante do código, todas as ideias serão apreciadas:

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

O comportamento padrão do HttpClient é compatível com os requisitos da especificação HTTP (RFC 2616)

 10.3.3 302 Encontrados
 ...

    Se o código de status 302 for recebido em resposta a uma solicitação
    de GET ou HEAD, o agente do usuário NÃO DEVE redirect automaticamente
    pedido, a menos que possa ser confirmado pelo usuário, pois isso pode
    alterar as condições sob as quais o pedido foi emitido.

Você pode replace o comportamento padrão do HttpClient subclassificando DefaultRedirectStrategy e substituindo o método #isRedirected ().

Para o HttpClient 4.3 :

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

Para o 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 http redirect é desabilitado por padrão. Eu tento habilitar, funciona mas ainda estou com erro com o meu problema. Mas ainda podemos lidar com o redirecionamento pragmaticamente. Eu acho que seu problema pode resolver: Então, código antigo:

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

Este código retornará contentSize = -1 se o redirecionamento http acontecer

E então eu ligo redirect por mim mesmo depois de tentar habilitar o redirecionamento de siga padrão

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

Em uso

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

Obrigado Nguyen

Minha solução está usando o HttClient. Eu tive que enviar a resposta de volta para o chamador. Esta é minha solução

  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(response.toString(), HttpStatus.ACCEPTED);