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

时间:2011-08-30 17:56:37

标签: java apache-httpclient-4.x apache-httpcomponents

我一直遇到这种情况,我收到了一个错误的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的内容并将其置于异常中。

4 个答案:

答案 0 :(得分:31)

Appache已经为名为EntityUtils

提供了一个Util类
String responseXml = EntityUtils.toString(httpResponse.getEntity());
EntityUtils.consume(httpResponse.getEntity());

答案 1 :(得分:21)

以下是一些将实体视为字符串的代码(假设您的请求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();
  }

答案 2 :(得分:2)

要启用人类可读的格式,您可以使用UTF-8代码将HttpEntity转换为字符串

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

这将为您提供json形式的Response参数,例如:

  

{“错误”:{“错误”:[{“域”:“全局”,“原因”:“禁止”,“消息”:“禁止”}],“代码”:403,“消息” :“禁止”}}

希望这可以解决问题。

答案 3 :(得分:0)

通常,如果要将DTO转换为String格式,则可以使用ObjectMapper。如果有帮助,请找到以下示例。

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