2011-08-30 32 views
11

Tôi tiếp tục chạy vào tình huống này, nơi tôi nhận được một phản ứng HTTP xấu (như 400) nhưng không thể nhìn vào HttpEntity trong đối tượng HttpResponse. Khi tôi bước qua với trình gỡ lỗi, tôi có thể thấy rằng thực thể có nội dung (độ dài> 0) và thậm chí tôi có thể xem nội dung, nhưng tất cả những gì tôi thấy là một dãy số (mã ASCII tôi đoán?) Hữu ích. Tôi sẽ gọi EntityUtils.toString() trên thực thể, nhưng tôi lấy lại một ngoại lệ - hoặc là một IOException, hoặc một số loại "đối tượng ở trạng thái không hợp lệ" ngoại lệ. Điều này thực sự bực bội! Có cách nào để xem nội dung này dưới dạng người có thể đọc được không?Có cách nào để lấy giá trị String của một HttpEntity khi EntityUtils.toString() trả về một ngoại lệ không?

Đây là mã của tôi:

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

Xem nơi tôi ném ngoại lệ? Những gì tôi muốn làm là hút nội dung của HttpEntity và đặt nó trong trường hợp ngoại lệ.

+1

Nếu việc xâu chuỗi không thành công, bạn luôn có thể nhận các byte thô với 'EntityUtils.toByteArray()' và tự mình tạo một bản trích lục hex. –

+0

Vâng, tôi đã nghĩ về điều đó. Biết về bất kỳ tiện ích nào sẽ lấy loại đầu ra [100, 21, 45, 22] mà chúng tôi nhận được từ trình gỡ lỗi và biến nó thành một cái gì đó mà con người có thể đọc được? – sangfroid

+1

Thử hàm tạo String: http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#String (byte [], java.lang.String) –

Trả lời

21

Dưới đây là một số mã để xem các thực thể như là một chuỗi (cho rằng yêu cầu contentType của bạn là html hoặc tương tự):

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 đã cung cấp một lớp util cho rằng gọi EntityUtils.

String responseXml = EntityUtils.toString(httpResponse.getEntity()); 
EntityUtils.consume(httpResponse.getEntity()); 
Các vấn đề liên quan