当前位置: 首页 > news >正文

HttpClient5.x

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

需求:

1、从文件中将URL全部读出来

2、利用HttpClient探测这些URL,到底是200、404、405、500、timeout

3、某些特殊的页面,虽然是200,但是页面被运维跳转到了403,这种情况也要找出来。

 

下面的代码分别对应上述需求

example1:

/**
     * 多取文件,直接用流读取
     *
     * @return
     * @throws Exception
     */
    public List<String> readFile(String fileName) throws Exception {
        String line;
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
        List<String> result = new ArrayList<String>();
        InputStreamReader reader = new InputStreamReader(
                inputStream); // 建立一个输入流对象reader
        BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
        while ((line = br.readLine()) != null) {
            result.add(line);
        }
        return result;
    }

注意:这里只传入一个文件名,然后利用类加载器的位置,找到这个文件。

 

2和3、example2和3:利用HttpClient调用这些URL

private InvokeResultEntity invokeUrl(String url) throws Exception {
        InvokeResultEntity invokeResultEntity = new InvokeResultEntity();
        invokeResultEntity.setUrl(url);
        RequestConfig config = RequestConfig.custom()
                .setConnectTimeout(TIME_OUT * 1000)
                .setConnectionRequestTimeout(TIME_OUT * 1000)
                .setSocketTimeout(TIME_OUT * 1000).build();
        CloseableHttpClient httpclient =
                HttpClientBuilder.create().setDefaultRequestConfig(config).build();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response1 = httpclient.execute(httpGet);
        try {
//            System.out.println("返回状态为:" + response1.getStatusLine());
            invokeResultEntity.setHttpCompleteStatus(response1.getStatusLine().toString());
            if (response1.getStatusLine().toString().indexOf("200 OK") > 0) {
                if(isContains403(response1)){
                    System.out.println(url + "----403,运维禁止成功");
                    invokeResultEntity.setHttpCode(HTTP_CODE_403);
                }else{
                    System.out.println(url + "----200,连接成功");
                    invokeResultEntity.setHttpCode(HTTP_CODE_200);
                }
                invokeResultEntity.setSuccess(true);
            } else if (response1.getStatusLine().toString().indexOf("405 Method Not Allowed") > 0) {
                System.out.println(url + "----405,连接失败");
                invokeResultEntity.setSuccess(false);
                invokeResultEntity.setHttpCode(HTTP_CODE_405);
            } else if (response1.getStatusLine().toString().indexOf("404 Not Found") > 0) {
                System.out.println(url + "----404,连接失败");
                invokeResultEntity.setSuccess(false);
                invokeResultEntity.setHttpCode(HTTP_CODE_404);
            } else if (response1.getStatusLine().toString().indexOf("500 Internal Server Error") > 0) {
                System.out.println(url + "----500,连接失败");
                invokeResultEntity.setSuccess(false);
                invokeResultEntity.setHttpCode(HTTP_CODE_500);
            } else {
                System.out.println(url + "----连接失败");
                invokeResultEntity.setSuccess(false);
                invokeResultEntity.setHttpCode(HTTP_CODE_UNKNOWN);
            }
            HttpEntity entity1 = response1.getEntity();
            EntityUtils.consume(entity1);
        } finally {
            response1.close();
        }
        return invokeResultEntity;
    }

注意:

2.1)、获取Http的返回状态是:

response1.getStatusLine()

它里面包含的就是200这些

 

2.2)、超时设置是:

RequestConfig config = RequestConfig.custom()
        .setConnectTimeout(TIME_OUT * 1000)
        .setConnectionRequestTimeout(TIME_OUT * 1000)
        .setSocketTimeout(TIME_OUT * 1000).build();

 

2.3)、获取Http中的内容是:response.getEntity,它拿到的是一个流

/**
     * 判断一个返回是否含有403
     * @param response
     * @return
     * @throws Exception
     */
    private  boolean isContains403(CloseableHttpResponse response) throws  Exception{
        boolean isContains403=false;
        String line;
        StringBuilder stringBuilder=new StringBuilder();
        InputStream inputStream=response.getEntity().getContent();
        InputStreamReader reader = new InputStreamReader(
                inputStream); // 建立一个输入流对象reader
        BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言
        while ((line = br.readLine()) != null) {
            stringBuilder.append(line);
        }
        if(stringBuilder.toString().indexOf("升级维护(403)")>0){
            isContains403=true;
        }
        return  isContains403;
    }

 

参考链接1  - 非常感谢Apache的QuickStart,可以非常快的入门

参考链接2 - 读文件获取里面的内容;

参考链接2.1 - 利用classloader加载文件

参考链接3 - 从HttpClient获取内容

参考链接4 - HttpClient超时设置

 

附git链接:https://gitee.com/iPhone2020/testurlisalive.git

转载于:https://my.oschina.net/windows20/blog/1544540

相关文章:

  • 【转载】Docker 镜像优化与最佳实践
  • 数据分析后遗症:大数据互联网隐私之殇
  • 洗礼灵魂,修炼python(5)--python操作符,内置函数
  • System Error. Code:1722. RPC服务器不可用解决办法
  • Spring Boot开启的2种方式
  • AnkhSVN 1.0 RC3 released on August 25, 2006
  • 爆零专场
  • 2017.10.2解题报告
  • 5、ASP.NET MVC入门到精通——NHibernate代码映射
  • VLAN及vlan路由
  • 产品经理也要云转型 需掌握这10个技能
  • Oracle权限管理
  • TCP/IP编程实现远程文件传输
  • xshell中复制快捷键的设置
  • MySQL之内联接、左联接、右联接、交叉联接
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【347天】每日项目总结系列085(2018.01.18)
  • co模块的前端实现
  • Docker 笔记(2):Dockerfile
  • JavaScript DOM 10 - 滚动
  • Java反射-动态类加载和重新加载
  • JS+CSS实现数字滚动
  • js操作时间(持续更新)
  • js学习笔记
  • LeetCode29.两数相除 JavaScript
  • V4L2视频输入框架概述
  • Vue2.x学习三:事件处理生命周期钩子
  • Yeoman_Bower_Grunt
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深度学习在携程攻略社区的应用
  • 手写一个CommonJS打包工具(一)
  • 我从编程教室毕业
  • 详解NodeJs流之一
  • 再谈express与koa的对比
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (7)STL算法之交换赋值
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (LeetCode) T14. Longest Common Prefix
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二十三)Flask之高频面试点
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (六)vue-router+UI组件库
  • (转载)深入super,看Python如何解决钻石继承难题
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net打印*三角形
  • @Mapper作用
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • []T 还是 []*T, 这是一个问题
  • [2021 蓝帽杯] One Pointer PHP
  • [ACTF2020 新生赛]Include
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [HEOI2013]ALO