2011-08-30 30 views
11

私は悪いHTTP応答(400のような)を返すが、HttpResponseオブジェクトのHttpEntityを見ることができないこの状況に陥っています。デバッガをステップ実行すると、エンティティにコンテンツ(長さ> 0)があり、コンテンツを見ることさえできますが、表示されるのは数字の配列(私が推測するASCIIコードですか?)です役に立ったエンティティでEntityUtils.toString()を呼び出しますが、IOException、または「オブジェクトが無効な状態になっています」という例外が返されます。これは本当にイライラしています!このコンテンツを人間が読める形式で入手する方法はありますか?ここでEntityUtils.toString()が例外を返すときに、HttpEntityのString値を取得する方法はありますか?

は私のコードです:私は例外をスローどこ

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

文字列化に失敗した場合は、常に 'EntityUtils.toByteArray()'で生のバイトを取得し、それらのバイトの16進ダンプを自分で生成することができます。 –

+0

ええ、私はそれを考えました。私たちがデバッガから得た[100,21,45,22]タイプの出力をとり、それを人が読めるものに変えるユーティリティを知っていますか? – sangfroid

+1

Stringコンストラクタを試してください。http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#String(byte []、java.lang.String) –

答えて

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

AppacheはすでにEntityUtilsと呼ばれるそのためUtilのクラスを提供してきました。

String responseXml = EntityUtils.toString(httpResponse.getEntity()); 
EntityUtils.consume(httpResponse.getEntity()); 
関連する問題