example java apache-commons-httpclient

java - example - ¿Cuál es la forma recomendada de obtener la respuesta HTTP como una cadena al usar el Cliente HTTP de Apache?



httpclient java (4)

Acabo de comenzar a usar la biblioteca del cliente HTTP de Apache y noté que no había un método incorporado para obtener la respuesta HTTP como una cadena. Solo busco obtenerlo como String para poder pasarlo a cualquier biblioteca de análisis que esté usando.

¿Cuál es la forma recomendada de obtener la respuesta HTTP como una cadena? Aquí está mi código para hacer la solicitud:

public String doGet(String strUrl, List<NameValuePair> lstParams) { String strResponse = null; try { HttpGet htpGet = new HttpGet(strUrl); htpGet.setEntity(new UrlEncodedFormEntity(lstParams)); DefaultHttpClient dhcClient = new DefaultHttpClient(); PersistentCookieStore pscStore = new PersistentCookieStore(this); dhcClient.setCookieStore(pscStore); HttpResponse resResponse = dhcClient.execute(htpGet); //strResponse = getResponse(resResponse); } catch (ClientProtocolException e) { throw e; } catch (IOException e) { throw e; } return strResponse; }


En términos de concisión del código, podría estar utilizando la API Fluent de la siguiente manera:

import org.apache.http.client.fluent.Request; [...] String result = Request.Get(uri).execute().returnContent().asString();

La documentación advierte, sin embargo, que este enfoque no es ideal en términos de consumo de memoria.


Necesitas consumir el cuerpo de respuesta y obtener la respuesta:

BufferedReader br = new BufferedReader(new InputStreamReader(httpresponse.getEntity().getContent()));

Y luego leerlo:

String readLine; String responseBody = ""; while (((readLine = br.readLine()) != null)) { responseBody += "/n" + readLine; }

El responseBody ahora contiene su respuesta como cadena.

(No olvide cerrar BufferedReader al final: br.close() )


Puedes hacer algo como:

Reader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent(), "UTF-8"));

Usando el lector podrás construir tu cadena. Pero si está utilizando SAX, puede asignar la transmisión directamente al analizador. De esta manera, no tendrá que crear la cadena y su huella de memoria también será menor.


Puedes usar EntityUtils#toString() para esto.

// ... HttpResponse response = client.execute(get); String responseAsString = EntityUtils.toString(response.getEntity()); // ...