悪い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のコンテンツを吸い出して例外に入れることです。
Apacheは EntityUtils と呼ばれるUtilクラスをすでに提供しています。
String responseXml = EntityUtils.toString(httpResponse.getEntity());
EntityUtils.consume(httpResponse.getEntity());
エンティティを文字列として表示するためのコードを次に示します(リクエストの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();
}
人間が読める形式を有効にするには、HttpEntityをUTF-8コードで文字列に変換できます
EntityUtils.toString(response.getEntity(), "UTF-8")
これにより、次のようなjson形式の応答パラメーターが得られます。
{"error":{"errors":[{"domain": "global"、 "reason": "forbidden"、 "message": "Forbidden"}]、 "code":403、 "message": "Forbidden 「}}
これで問題が解決することを願っています。
一般に、DTOを文字列形式に変換する場合は、ObjectMapperを使用できます。役立つ場合は、次の例を見つけてください。
public static String getObjectAsString(Object object) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(object);
} catch (Exception e) {
return null;
}
}