2011-08-30 6 views
11

Continuo a correre in questa situazione in cui ottengo una risposta HTTP non valida (come una 400) ma non riesco a guardare l'HttpEntity nell'oggetto HttpResponse. Quando passo con il debugger, posso vedere che l'entità ha contenuto (lunghezza> 0) e posso anche guardare il contenuto, ma tutto quello che vedo è una serie di numeri (codici ASCII credo?) Che non è utile. Chiamerò EntityUtils.toString() sull'entità, ma restituisco un'eccezione - un'eccezione IOException o qualche tipo di "oggetto è in uno stato non valido". Questo è davvero frustrante! C'è un modo per ottenere questo contenuto in una forma leggibile?Esiste un modo per ottenere il valore String di un HttpEntity quando EntityUtils.toString() restituisce un'eccezione?

Ecco il mio codice:

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

Vedere dove butto l'eccezione? Quello che mi piacerebbe fare è succhiare il contenuto di HttpEntity e metterlo nell'eccezione.

+1

Se stringizing fallisce, si può sempre ottenere i byte prime con 'EntityUtils.toByteArray()' e produrre un dump esadecimale di quei byte da soli. –

+0

Sì, ci ho pensato. Conoscere eventuali utilità che prenderanno il tipo di output [100, 21, 45, 22] che otteniamo dal debugger e trasformarlo in qualcosa di leggibile? – sangfroid

+1

Prova il costruttore String: http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#String (byte [], java.lang.String) –

risposta

21

Ecco il codice per visualizzare l'entità come una stringa (dato che la vostra richiesta è contentType html o simile):

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 ha già fornito una classe Util per questo chiamato EntityUtils.

String responseXml = EntityUtils.toString(httpResponse.getEntity()); 
EntityUtils.consume(httpResponse.getEntity()); 
Problemi correlati