有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有一种方法可以在EntityUtils时获取HttpEntity的字符串值。toString()返回异常?

我经常遇到这样的情况:我得到一个错误的HTTP响应(比如400),但无法查看HttpResponse对象中的HttpEntity。当我逐步使用调试器时,我可以看到实体有内容(长度>;0),我甚至可以查看内容,但我看到的只是一个数字数组(我猜是ASCII码?)这没用。我会打电话给EntityUtils。但我得到了一个异常——要么是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) 个答案

  1. # 1 楼答案

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

    String responseXml = EntityUtils.toString(httpResponse.getEntity());
    EntityUtils.consume(httpResponse.getEntity());
    
  2. # 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();
      }
    
  3. # 3 楼答案

    通常,如果要将DTO转换为字符串格式,可以使用ObjectMapper。如果以下示例有用,请查找

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

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

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

    这将为您提供json格式的响应参数,如:

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

    希望这能解决问题