wake-up-neo.com

Gibt es eine Möglichkeit, den String-Wert einer HttpEntity abzurufen, wenn EntityUtils.toString () eine Ausnahme zurückgibt?

Ich laufe immer wieder in diese Situation, in der ich eine fehlerhafte HTTP-Antwort (wie eine 400) erhalte, aber nicht auf die HttpEntity im HttpResponse-Objekt zugreifen kann. Wenn ich mit dem Debugger durchgehe, sehe ich, dass die Entität Inhalt hat (Länge> 0), und ich kann sogar den Inhalt betrachten, aber alles, was ich sehe, ist ein Array von Zahlen (ASCII-Codes, nehme ich an?), Was nicht hilfreich. Ich rufe EntityUtils.toString () für die Entität auf, erhalte jedoch eine Ausnahme zurück - entweder eine IOException oder eine Art Ausnahme "Objekt befindet sich in einem ungültigen Zustand". Das ist wirklich frustrierend! Gibt es eine Möglichkeit, auf diese Inhalte in einer für Menschen lesbaren Form zuzugreifen?

Hier ist mein 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();
    }
}

Sehen Sie, wo ich die Ausnahme werfe? Ich würde gerne den Inhalt der HttpEntity heraussaugen und in die Ausnahme stellen.

14
sangfroid

Apache hat bereits eine Util-Klasse für das genannte EntityUtils bereitgestellt.

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

Hier ist etwas Code, um die Entität als eine Zeichenfolge anzuzeigen (vorausgesetzt, Ihre Anfrage contentType ist html oder ähnliches):

   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

Um ein für Menschen lesbares Formular zu aktivieren, können Sie HttpEntity mit UTF-8-Code in eine Zeichenfolge konvertieren

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

Dies gibt Ihnen Antwortparameter in json-Form wie: 

{"error": {"errors": [{"domain": "global", "reason": "verboten", "message": "Forbidden"}], "code": 403, "message": "Verboten "}}

Hoffe, das löst das Problem.

1
Anand Tuli

Wenn Sie Ihr DTO-Format in ein String-Format konvertieren möchten, können Sie im Allgemeinen ObjectMapper verwenden. Finden Sie das folgende Beispiel, wenn es hilfreich ist.

public static String getObjectAsString(Object object) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writeValueAsString(object);
    } catch (Exception e) {
        return null;
    }
}
0
Sumanth Varada