FunTester 使用 httpclient 中 EntityUtils 类解析 entity 遇到 socket closed 错误的原因

FunTester · 2020年03月30日 · 1381 次阅读

本人在使用 httpclient 做接口测试的时候,最近程序偶然报 socket closed 错误,上周经过排查发现是 request.releaseConnection() 这个方法搞得鬼,也是自己学艺不精,没有真正理解方法的含义,改掉之后其他接口就没有出现过这个问题,今天又遇到了,又重新排查了自己的方法,发现还有一种导致 socket closed 的原因,因为我的响应对象创建时用的是 CloseableHttpResponse 类,所以需要关闭,在某些时候 response 太大可能导致使用 EntityUtils.toString(entity) 解析实体的时候出错,个人理解是由于 response 的并未完全解析到 entity 里面时已经执行了 close() 方法导致的,试着把 close() 方法后置,完美解决问题。

下面是我的错误代码片段:

try {
            response.close();
        } catch (IOException e2) {
            output("响应关闭失败!", e2);
        }
        data_size = entity.getContentLength();// 获取相应数据大小
        if (data_size == -1) {// 如果为-1,则重置data_size
            data_size = 0;
        }
        String content = null;
        try {
            content = EntityUtils.toString(entity);// 用string接收响应实体

            EntityUtils.consume(entity);// 消耗响应实体
        } catch (ParseException e1) {
            output("解析响应实体异常!", e1);
        } catch (IOException e1) {
            output("解析响应实体时java IO 异常!", e1);
        } // 解析响应

下面是修改之后的代码片段:

String content = null;
        try {
            content = EntityUtils.toString(entity);// 用string接收响应实体
            EntityUtils.consume(entity);// 消耗响应实体
        } catch (ParseException e1) {
            output("解析响应实体异常!", e1);
        } catch (IOException e1) {
            output("解析响应实体时java IO 异常!", e1);
        } // 解析响应
        try {
            response.close();
        } catch (IOException e2) {
            output("响应关闭失败!", e2);
        }

技术类文章精选

  1. java 一行代码打印心形
  2. Linux 性能监控软件 netdata 中文汉化版
  3. 接口测试代码覆盖率(jacoco)方案分享
  4. 性能测试框架
  5. 如何在 Linux 命令行界面愉快进行性能测试
  6. 图解 HTTP 脑图
  7. 如何测试概率型业务接口
  8. httpclient 处理多用户同时在线
  9. 将 swagger 文档自动变成测试代码
  10. 五行代码构建静态博客
  11. httpclient 如何处理 302 重定向
  12. 基于 java 的直线型接口测试框架初探

非技术文章精选

  1. 为什么选择软件测试作为职业道路?
  2. 成为杰出 Java 开发人员的 10 个步骤
  3. 写给所有人的编程思维
  4. 自动化测试的障碍
  5. 自动化测试的问题所在
  6. 测试之《代码不朽》脑图

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册