2012-08-23 10 views
16

Acabo de comenzar a utilizar la biblioteca de cliente HTTP de Apache y noté que no había un método incorporado para obtener la respuesta HTTP como una cadena. Solo estoy buscando obtenerlo como String para poder pasarlo a la biblioteca de análisis que estoy usando.¿Cuál es la forma recomendada de obtener la respuesta HTTP como una cadena cuando se utiliza el cliente HTTP de Apache?

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

} 

Respuesta

44

Puede utilizar EntityUtils#toString() para esto.

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

esta es la mejor opción para HttpClient. Apache Jersey es, en mi opinión, mucho más fácil de trabajar que HttpClient. –

+1

@Paul: No estoy seguro de lo que quiere decir con "Apache Jersey". No hay tal cosa en el proyecto Apache. ["Jersey"] (http://jersey.java.net) es la implementación de referencia de Sun/Oracle de la API JAX-RS que no es un cliente HTTP en absoluto. – BalusC

+1

lo siento, quise decir camiseta de sol/oráculo. contiene un cliente http con una API más fluida. –

5

Hay que consumir el cuerpo de la 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 se olvide de cerrar la BufferedReader en el final: br.close())

1

Usted puede hacer algo como:

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

Uso del lector de usted será capaz de construir su cadena. Pero si está utilizando SAX, puede transmitir la secuencia directamente al analizador. De esta forma no tendrás que crear la cadena y tu huella de memoria también será menor.

0

En cuanto a la concisión de código que pueda estar utilizando el Fluent API así:

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.

Cuestiones relacionadas