2011-08-30 26 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

तो stringizing में विफल रहता है, तो आप हमेशा के साथ 'EntityUtils.toByteArray()' कच्चे बाइट्स हो और उन बाइट्स खुद की एक हेक्स डंप उत्पादन कर सकता है। –

+0

हाँ, मैंने इसके बारे में सोचा। किसी भी उपयोगिताओं के बारे में जानें जो [100, 21, 45, 22] आउटपुट प्रकार को हम डीबगर से प्राप्त करेंगे और इसे मानव-पठनीय चीज़ में बदल देंगे? – sangfroid

+1

स्ट्रिंग कन्स्ट्रक्टर आज़माएं: http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#String (बाइट [], 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());