//執行請求 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);