2012-08-23 15 views
16

Ho appena iniziato a utilizzare la libreria HTTP Client di Apache e ho notato che non esisteva un metodo incorporato per ottenere la risposta HTTP come stringa. Sto solo cercando di ottenerlo come String in modo che possa passarlo a qualsiasi libreria di analisi che sto usando.Qual è il modo consigliato per ottenere la risposta HTTP come stringa quando si utilizza il client HTTP di Apache?

Qual è il modo consigliato di ottenere la risposta HTTP come stringa? Ecco il mio codice per fare la richiesta:

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; 

} 

risposta

44

È possibile utilizzare EntityUtils#toString() per questo.

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

questa risposta è la strada da percorrere per HttpClient. La maglia Apache è, a mio parere, molto più semplice da utilizzare rispetto a HttpClient. –

+1

@Paul: Non sono sicuro di cosa intendi con "Apache Jersey". Non c'è nulla di simile nel progetto Apache. ["Jersey"] (http://jersey.java.net) è l'implementazione di riferimento Sun/Oracle dell'API JAX-RS che non è affatto un client HTTP. – BalusC

+1

scusa, intendevo la maglia sole/oracolo. contiene un client http con un'API più fluente. –

5

è necessario consumare il corpo della risposta e ottenere la risposta:

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

E poi leggerlo:

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

Il responseBody ora contiene la risposta come stringa.

(Non dimenticare di chiudere il BufferedReader alla fine: br.close())

1

Si può fare qualcosa di simile:

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

Utilizzando il lettore si sarà in grado di costruire la vostra stringa. Ma se stai usando SAX puoi dare direttamente lo stream al parser. In questo modo non dovrai creare la stringa e anche il tuo footprint di memoria sarà più basso.

0

In termini di concisione di codice che potrebbero utilizzare il Fluent API in questo modo:

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

La documentazione avverte però che questo approccio non è l'ideale in termini di consumo di memoria.