2019独角兽企业重金招聘Python工程师标准>>>
需求:
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