web-dev-qa-db-fra.com

Quelle est la méthode recommandée pour obtenir la réponse HTTP sous forme de chaîne lorsque vous utilisez le client HTTP Apache?

Je viens tout juste de commencer à utiliser la bibliothèque HTTP Client d'Apache et j'ai constaté qu'il n'existait aucune méthode intégrée permettant d'obtenir la réponse HTTP sous forme de chaîne. Je cherche juste à l'obtenir en tant que String afin que je puisse le transmettre à la bibliothèque d'analyse syntaxique que j'utilise.

Quelle est la méthode recommandée pour obtenir la réponse HTTP sous forme de chaîne? Voici mon code pour faire la demande:

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;

}
16
Mridang Agarwalla

Vous pouvez utiliser EntityUtils#toString() pour cela.

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

Vous devez utiliser le corps de la réponse et obtenir la réponse:

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

Et puis lisez-le:

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

Le responseBody contient maintenant votre réponse sous forme de chaîne.

(N'oubliez pas de fermer BufferedReader à la fin: br.close())

5
Pedro Nunes

Vous pouvez faire quelque chose comme:

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

En utilisant le lecteur, vous pourrez construire votre chaîne. Mais si vous utilisez SAX, vous pouvez donner le flux directement à l'analyseur. De cette manière, vous n’aurez pas à créer la chaîne et votre empreinte mémoire sera également réduite. 

1
dan

En termes de concision du code, il se peut qu’il utilise l’API Fluent comme ceci:

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

La documentation avertit cependant que cette approche n'est pas idéale en termes de consommation de mémoire.

0
anothernode