Java:基于API接口的小程序

功能上设计为:对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即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值