//执行请求 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);
1. 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() 是否分块传输 */
2. 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);
3. 推荐方式
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);