有没有办法在 EntityUtils.toString() 返回异常时获取 HttpEntity 的 String 值?

我一直遇到这种情况,我得到了一个错误的HTTP响应(如400),但无法查看HttpResponse对象中的HttpEntity。当我逐步执行调试器时,我可以看到实体具有内容(长度>0),我甚至可以查看内容,但我看到的只是一个数字数组(我猜是ASCII代码?),这没有帮助。我将在实体上调用 EntityUtils.toString(),但我得到一个异常 - 要么是 IOException,要么是某种“对象处于无效状态”异常。这真的很令人沮丧!有没有办法以人类可读的形式获取此内容?

这是我的代码:

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

看到我在哪里引发异常了吗?我想做的是吸出HttpEntity的内容并将其放在例外中。


答案 1

Appache已经为它提供了一个名为EntityUtils的Util类。

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

答案 2

下面是一些以字符串形式查看实体的代码(假设您的请求 contentType 是 html 或类似的):

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

推荐