如何解析響應內容


//執行請求
CloseableHttpResponse response = httpClient.execute(httpPost);
//獲取所有響應頭
//Header[] getAllHeaders()
//Header[] getHeaders(name)
Header[] allHeaders = response.getAllHeaders();
for(Header header : allHeaders){
    System.out.println(header.getName()+" : " + header.getValue());
}

//獲取響應狀態行,進而獲取響應狀態碼
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("狀態碼:" + statusCode);

//獲取響應的MIME類型
String contentMimeType = ContentType.getOrDefault(response.getEntity()).getMimeType();
System.out.println("媒體類型:" + contentMimeType);

//獲取響應的內容,這里只演示簡單的文本內容,實際開發中並不總是這么簡單,后面詳細地講解
String bodyAsString = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println("響應內容:" + bodyAsString);
HttpEntity http實體
/**
 * HttpEntity 可以攜帶與請求或響應相關的內容信息
 * HttpClient中的實體分為 streamed流式、自我包含式、包裝式
 *      streamed流式:從一個流傳輸中獲得,一般是來自http連接。特點是使用時產生,不可重復。從response獲取的實體就是這種類型
 *      自我包含式:存儲在內存中的,獨立於http連接。特點是可以重復。
 *      包裝式:從其他 HttpEntity中獲得。特別是依附於獲取的類。
 *
 * HttpEntity在 HttpClient有以下實現類:
 *      BasicHttpEntity streamed流式, 從輸入流獲取
 *      ByteArrayEntity 自我包含式, 從指定的字節數組取出內容的實體
 *      StringEntity 自我包含式, 由String創建的實體
 *      InputStreamEntity  streamed流式, 由InputStream創建的實體
 *      FileEntity 自我包含式, 從文件獲取內容的實體
 *      EntityTemplate
 *      HttpEntityWrapper
 *      BufferedHttpEntity 可以把不可以重復的實體,實現成可以重復的實體。它從提供的實體中讀取內容,緩存到內容中。
 * HttpEntity 有以下方法:
 *      InputStream getContent() 返回的是一個實體內容的流。
 *              注:這里的流與上面所說的流式實體概念有所不同。
 *                  上文所說流式實體是指從連接產生具有實時性的流,而這里僅僅指內容流形式,不要混淆。
 *      Header getContentEncoding() 獲取 HttpEntity(如果有的話)實體已編碼內容的頭部信息
 *      long getContentLength() 獲取整個實體內容的長度
 *      boolean isRepeatable() 判斷實體是否具有重現的能力
 *      boolean isStreaming()判斷實體的內容是不是基於流
 *      void writeTo(OutputStream outStream)將實體寫入一個輸出流
 *      isChunked() 是否分塊傳輸
 */
EntityUtils
/**
 *
 * EntityUtils是 HttpClient自帶的工具類,可以更容易得讀取內容和信息。
 * EntityUtils有以下方法:
 *      toString() content-length 長度不能超過 2147483647L, 長度小於0時,設置為 4096
 *      toByteArray()  content-length 長度不能超過 2147483647L, 長度小於0時,設置為 4096
 *      consume() 關閉 HttpEntity的流
 *      consumeQuietly() 與consume是一樣的,不知道定義這個方法意義何在
 */
HttpEntity httpEntity = response.getEntity();
String bodyContent = EntityUtils.toString(httpEntity, Consts.UTF_8);
System.out.println(bodyContent);
推薦方式
HttpEntity httpEntity = response.getEntity();
/**
 * 推薦消耗實體內容的方式是使用它的 getContent()方法或 writeTo(OutputStream)方法,除非
 * 響應實體源自可靠的HTTP服務器和已經長度限制。
 */
InputStream inputStream = httpEntity.getContent();
//<1>創建字節數組輸出流,用來輸出讀取到的內容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//<2>創建緩存大小
byte[] buffer = new byte[1024]; // 1KB
//每次讀取到內容的長度
int len = -1;
//<3>開始讀取輸入流中的內容
while ((len = inputStream.read(buffer)) != -1) { //當等於-1說明沒有數據可以讀取了
    baos.write(buffer, 0, len);   //把讀取到的內容寫到輸出流中
}
//<4> 把字節數組轉換為字符串
String content = baos.toString();
//<5>關閉輸入流和輸出流
inputStream.close();
baos.close();
//<6>返回字符串結果
System.out.println("內容是:" + content);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM