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());
// ...