如何解析响应内容

//执行请求
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);

 

posted @ 2020-01-16 09:01  codedot  阅读(2271)  评论(0编辑  收藏  举报