zoukankan      html  css  js  c++  java
  • 解析响应内容

    //执行请求
    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);
  • 相关阅读:
    BZOJ_3589_动态树_容斥原理+树链剖分
    吴裕雄--天生自然ORACLE数据库学习笔记:SQL语言基础
    吴裕雄--天生自然ORACLE数据库学习笔记:常用SQL*Plus命令
    吴裕雄--天生自然python数据清洗与数据可视化:MYSQL、MongoDB数据库连接与查询、爬取天猫连衣裙数据保存到MongoDB
    吴裕雄--天生自然PYTHON爬虫:使用Selenium爬取大型电商网站数据
    吴裕雄--天生自然PYTHON爬虫:使用Scrapy抓取股票行情
    吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据(效率优化以及代码容错处理)
    吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据(优化)
    吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:从零开始实现识别手写数字的神经网络
    吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:神经网络的理论基础
  • 原文地址:https://www.cnblogs.com/myitnews/p/12199564.html
Copyright © 2011-2022 走看看