功能上设计为:对API接口数据进行周期性的记录
大体的内容分四步:
- 获取API信息
- 解析JSON串
- 输出结果
- 定时运行
注:本段程序基于实际应用而编写,故在文章中仅展示核心方法并进行简化
一、获取API信息
1、jar包
//包
//核心组件 httpclient httpcore
//解析信息 JSONArray JSONObject
//所需组件
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
2、代码块
/**
* 获取接口数据,返回特定键值对
* @param url
* @param key
* @param value
* @return Map<String,Object>
* @throws IOException
*/
public Map<String,Object> getMapValue(String url,String key,String value) throws IOException{
//创建http请求客户端
CloseableHttpClient build = HttpClientBuilder.create().build();
//发送get请求
HttpGet httpGet = new HttpGet(url);
//设置Header信息
Header ID = new BasicHeader("id_name","id_value");
Header APPKEY = new BasicHeader("key_name","key_value");
httpGet.addHeader(ID);
httpGet.addHeader(APPKEY);
//执行发送Get请求
CloseableHttpResponse response = build.execute(httpGet);
Map<String,Object> valueMap = new HashMap();
ArrayList<Object> keyList = new ArrayList();
ArrayList<Object> valueList = new ArrayList();
//判断响应的状态是否为:200
if (response.getStatusLine().getStatusCode() == 200) {
//获取响应的实体
HttpEntity entity = response.getEntity();
//设置响应编码格式
String context = EntityUtils.toString(entity, "utf-8");
//将字符串转换为json格式
JSONObject parseContext = (JSONObject) JSONObject.parse(context);
//获取信息
Object getData = parseContext.get("data");
String data = getData.toString();
JSONObject parseData = (JSONObject)JSONObject.parse(data);
//拆解JSON串
JSONArray keys = parseData.getJSONArray(key);
JSONArray values = parseData.getJSONArray(value);
//暴力解析JSON串,获取拆解出的特定value列表(步骤二方法)
keyList = this.getArrayValues(keys);
valueList = this.getArrayValues(values);
}
//组合特定的键值对
for(int i = 0;i < keyList.size();i++){
valueMap.put(keyList.get(i).toString(),valueList.get(i));
}
return valueMap;
}
二、解析JSON串,获取目标信息
1、代码
/**
* 暴力解析字符串,并返回拆解出的value列表
* @param values
* @return ArrayList<Object>
*/
private ArrayList<Object> getArrayValues(Object values){
ArrayList<Object> jsonValues = new ArrayList();
String apiValues = values.toString();
//暴力拆解字符串
String[] strValues = apiValues.split("");
StringBuffer strValue = new StringBuffer();
//以非数字、汉字符号为划分,重新组合字符串
for (String value : strValues) {
String regex = "^[a-z0-9A-Z\u4e00-\u9fa5]+$";
if(value.matches(regex)){
strValue.append(value);
} else {
if(strValue.length() > 0) {
jsonValues.add(strValue);
strValue = new StringBuffer();
}
}
}
return jsonValues;
}
三、输出结果
1、获取API信息
/**
* 将获取到的信息拼接成字符串并输出文档
* @return String:调用时间
* @throws IOException
*/
public String getValue() throws IOException {
//设置参数
String url = "url";
String key = "key";
String value = "value";
//获取当前系统时间
String dateFlag = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
//接收返回信息
Map<String,Object> valueMap = this.getMapValue(url,key,value);
//获取map目标数值
String mapKey = "map_key";
String mapValue = "";
try{
mapValue = valueMap.get(mapKey).toString();
}catch(Exception e){
mapValue = 0;
}
//输出结果。此处选择的为输出到txt文件
StringBuffer output = new StringBuffer();
output.append(mapKey + ":" + mapValue);
output.append("\n");
//打印(三-2方法)
this.writeData(output.toString());
return dateFlag;
}
2、输出txt文件
public void writeData(String output) {
//设置时间戳
String DATE = new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());
//文档路径
String PATH = "path";
String fileName = "name_" + DATE + ".txt"
File monitorFile = new File(PATH + fileName);
//判断文件是否存在
try {
if (!monitorFile.exists()) {
monitorFile.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
//向文件写入数据
try(FileWriter output = new FileWriter(monitorFile,true)){
output.write(output);
} catch(FileNotFoundException e){
e.fillInStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
四、定时运行
定时运行的控制方式选择了在main方法中直接调用Timer的方式
1、代码
public static void main(String[] args) throws IOException {
Timer timer = new Timer();
MyTask task = new MyTask();
//首次运行延迟时间(毫秒)
long delay = 1000;
//运行周期(毫秒)
long period = 180000;
timer.schedule(task,delay,period);
}
/**
* 为简化脚本,暴力处理了可能由程序报错所引起的脚本中断问题
*/
public static class MyTask extends TimerTask{
@Override
public void run() {
try {
System.out.println(this.getValue());
} catch (Exception e) {
System.out.println("Script Exception");
}
}
}
2、打包jar
此步骤视工具不同而略有区别,可自行百度。
3、运行
由cmd进入jar包路径,运行java -jar name.jar
即可。