178 votes

Comment puis-je obtenir le corps d'une réponse HTTP sous forme de chaîne de caractères ?

Je sais qu'il y avait un moyen de l'obtenir avec Apache Commons comme documenté ici :

http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html

...et un exemple ici :

http://www.kodejava.org/examples/416.html

...mais je crois que cela est déprécié.

Existe-t-il un autre moyen de faire une requête http get en Java et d'obtenir le corps de la réponse sous forme de chaîne et non de flux ?

1 votes

Puisque la question et toutes les réponses semblent concerner les bibliothèques d'Apache, il convient d'étiqueter cette question comme telle. Je ne vois rien sans l'utilisation de librairies tierces.

0 votes

307voto

shahtapa Points 491

Voici deux exemples tirés de mon projet de travail.

  1. Utilisation de EntityUtils y HttpEntity

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
  2. Utilisation de BasicResponseHandler

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);

12 votes

Le seul problème que j'ai rencontré avec la méthode 1 est que l'objet entité est consommé lorsque vous faites response.getEntity() et il est maintenant disponible en tant que responseString . si vous essayez à nouveau de faire un response.getEntity(), il retournera IllegalStateException .

0 votes

Cela a fonctionné dans mon cas - obtenir le corps de la réponse CloseableHttpClient.

2 votes

Qu'est-ce que httpClient ?

113voto

WhiteFang34 Points 28652

Toutes les bibliothèques auxquelles je pense renvoient un flux. Vous pouvez utiliser IOUtils.toString() de Apache Commons IO pour lire un InputStream en un String en un seul appel de méthode. Par exemple :

URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);

Mise à jour : J'ai modifié l'exemple ci-dessus pour utiliser l'encodage du contenu de la réponse s'il est disponible. Sinon, le codage par défaut est UTF-8, au lieu d'utiliser le codage par défaut du système local.

4 votes

Cette méthode corrompt le texte dans de nombreux cas, car elle utilise le codage de texte par défaut du système, qui varie en fonction du système d'exploitation et des paramètres de l'utilisateur.

1 votes

@McDowell : oops merci, j'ai lié la javadoc pour la méthode avec l'encodage mais j'ai oublié de l'utiliser dans l'exemple. J'ai ajouté UTF-8 à l'exemple pour le moment, bien que techniquement, il faudrait utiliser la méthode Content-Encoding de la réponse, s'il est disponible.

0 votes

Excellente utilisation de IOUtils. Belle approche pratique.

52voto

moonlightcheese Points 4818

Voici un exemple tiré d'un autre projet simple sur lequel je travaillais en utilisant la bibliothèque httpclient d'Apache :

String response = new String();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("j", request));
HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs);

HttpPost httpPost = new HttpPost(mURI);
httpPost.setEntity(requestEntity);
HttpResponse httpResponse = mHttpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
    response = EntityUtils.toString(responseEntity);
}

il suffit d'utiliser EntityUtils pour récupérer le corps de la réponse sous forme de chaîne. très simple.

30voto

McDowell Points 62645

C'est relativement simple dans le cas particulier, mais assez délicat dans le cas général.

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.com/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.getContentMimeType(entity));
System.out.println(EntityUtils.getContentCharSet(entity));

La réponse dépend de la Content-Type En-tête de réponse HTTP .

Cet en-tête contient des informations sur la charge utile et sur pourrait définir l'encodage des données textuelles. Même si vous supposez types de texte vous devrez peut-être inspecter le contenu lui-même afin de déterminer le codage correct des caractères. Voir, par exemple, le Spécification HTML 4 pour plus de détails sur la façon de procéder pour ce format particulier.

Une fois que l'encodage est connu, un InputStreamReader peut être utilisé pour décoder les données.

Cette réponse dépend du bon fonctionnement du serveur. Si vous voulez gérer les cas où les en-têtes de réponse ne correspondent pas au document, ou si les déclarations du document ne correspondent pas à l'encodage utilisé, c'est une autre paire de manches.

0 votes

Comment l'obtenir en tant que HashMap ? Je reçois la réponse en Json, comment la lire ?

10voto

Akshay Points 33

La réponse de McDowell est correcte. Cependant, si vous essayez d'autres suggestions dans quelques-uns des messages ci-dessus.

HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
   response = EntityUtils.toString(responseEntity);
   S.O.P (response);
}

Il vous donnera alors une illegalStateException indiquant que le contenu est déjà consommé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X