2011-08-30 120 views
11

我一直遇到這種情況,我得到一個錯誤的HTTP響應(如400),但無法看到HttpResponse對象中的HttpEntity。當我使用調試器時,我可以看到實體具有內容(長度> 0),我甚至可以查看內容,但是我看到的只是一組數字(我猜是ASCII碼),它不是很有幫助。我將在實體上調用EntityUtils.toString(),但是我得到一個異常 - IOException或某種「對象處於無效狀態」異常。這真令人沮喪!有沒有辦法以人類可讀的形式獲取此內容?當EntityUtils.toString()返回異常時,有沒有辦法獲得HttpEntity的字符串值?

這裏是我的代碼:

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()'獲取原始字節,並自己生成這些字節的十六進制轉儲。 –

+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提供一個實用程序類。

String responseXml = EntityUtils.toString(httpResponse.getEntity()); 
EntityUtils.consume(httpResponse.getEntity()); 
相關問題