web-dev-qa-db-ja.com

EntityUtils.toString()が例外を返すときにHttpEntityの文字列値を取得する方法はありますか?

悪い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のコンテンツを吸い出して例外に入れることです。

19
sangfroid

Apacheは EntityUtils と呼ばれるUtilクラスをすでに提供しています。

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

エンティティを文字列として表示するためのコードを次に示します(リクエストの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();
  }
21
JaVaBoy

人間が読める形式を有効にするには、HttpEntityをUTF-8コードで文字列に変換できます

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

これにより、次のようなjson形式の応答パラメーターが得られます。

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

これで問題が解決することを願っています。

2
Anand Tuli

一般に、DTOを文字列形式に変換する場合は、ObjectMapperを使用できます。役立つ場合は、次の例を見つけてください。

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