web-dev-qa-db-fra.com

Existe-t-il un moyen d’obtenir la valeur String d’une HttpEntity lorsque EntityUtils.toString () renvoie une exception?

Je continue à courir dans cette situation où je reçois une mauvaise réponse HTTP (comme un 400) mais je ne peux pas regarder le HttpEntity dans l'objet HttpResponse. Lorsque je passe au travers du débogueur, je peux voir que l'entité a un contenu (longueur> 0) et je peux même regarder le contenu, mais tout ce que je vois est un tableau de nombres (codes ASCII, je suppose?) Qui ne le sont pas. utile. J'appellerai EntityUtils.toString () sur l'entité, mais je récupèrerai une exception - une exception IOException ou une sorte d'exception "l'objet est dans un état non valide". C'est vraiment frustrant! Existe-t-il un moyen d'obtenir ce contenu sous une forme lisible par l'homme?

Voici mon code:

    protected JSONObject makeRequest(HttpRequestBase request) throws ClientProtocolException, IOException, JSONException, WebRequestBadStatusException {

    HttpClient httpclient = new DefaultHttpClient();

    try {
        request.addHeader("Content-Type", "application/json");
        request.addHeader("Authorization", "OAuth " + accessToken);
        request.addHeader("X-PrettyPrint", "1");

        HttpResponse response = httpclient.execute(request);
        int statusCode = response.getStatusLine().getStatusCode();

        if (statusCode < 200 || statusCode >= 300) {
            throw new WebRequestBadStatusException(statusCode);
        }

        HttpEntity entity = response.getEntity();

        if (entity != null) {
            return new JSONObject(EntityUtils.toString(entity));
        } else {
            return null;
        }

    } finally {
        httpclient.getConnectionManager().shutdown();
    }
}

Voir où je jette l'exception? Ce que j'aimerais faire, c'est aspirer le contenu de HttpEntity et le mettre à l'exception.

14
sangfroid

Apache a déjà fourni une classe Util pour celui appelé EntityUtils .

String responseXml = EntityUtils.toString(httpResponse.getEntity());
EntityUtils.consume(httpResponse.getEntity());
25
Ahmad Nadeem

Voici un code pour afficher l'entité en tant que chaîne (étant donné que votre demande contentType est html ou similaire):

   String inputLine ;
 BufferedReader br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
 try {
       while ((inputLine = br.readLine()) != null) {
              System.out.println(inputLine);
       }
       br.close();
  } catch (IOException e) {
       e.printStackTrace();
  }
21
JaVaBoy

Pour activer un formulaire lisible par l'homme, vous pouvez convertir HttpEntity en chaîne avec du code UTF-8.

EntityUtils.toString(response.getEntity(), "UTF-8")

Cela vous donnera les paramètres de réponse sous forme json comme: 

{"erreur": {"erreurs": [{"domaine": "global", "raison": "interdit", "message": "interdit"} "," code ": 403," message ":" interdit " "}}

J'espère que cela résout le problème.

1
Anand Tuli