动态拉取接口数据

news2024/11/19 1:47:50

通过工具类动态拉取接口数据

写在前言:

使用工具类拉取接口中的数据,存放在自己的数据库,进行展示。
自己去看工具类中的注释,按照自己的需求去修改。

在这里插入图片描述

一、工具类

1、整理需求

想通过工具类把接口数据存放在数据库,并且别人接口中的数据发生变化。自己数据库中的数据也要发生变化。

2、技术显现

1、需要通过登录拿到token
2、把token放入全局的作用域
3、定时任务。自动到时间去请求接口。(5分钟一次,把请求过来的数据,存放在数据库中)


import com.baidu.util.TokenUtil;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * jdk 调用第三方接口
 * @author hsq
 */
@Component
public class HttpClientUtil2 {

    public static String doPost(String pathUrl, String data){
        OutputStreamWriter out = null;
        BufferedReader br = null;
        String result = "";
        try {
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"POST",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("POST");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接

//            application/json;charset=utf-8;
            conn.setRequestProperty("Content-Type", "application/json");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的三句代码,就是调用第三方http接口
             */
            //获取URLConnection对象对应的输出流
            //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //发送请求参数即数据
            out.write(data);
            //flush输出流的缓冲
            out.flush();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null){
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (out != null){
                    out.close();
                }
                if (br != null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    /**
     * 以get方式调用对方接口方法
     * @param pathUrl
     */
    public static String doGet(String pathUrl){
        BufferedReader br = null;
        String result = "";
        try {
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"GET",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("GET");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存(get可以不使用)
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String str = "";
            while ((str = br.readLine()) != null){
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (br != null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

二、通过工具类解析接口

1、通过上面的工具类解析token

1、通过fastjson进行解析接口数据
2、通过工具类获得接口中的token

  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.79</version>
  </dependency>

3、请自行创建包名,类名。这里就是通过fastjson,添加接口中必须要填写的参数。通过工具类获得token

package com.baidu.demo.task;

import com.alibaba.fastjson.JSONObject;
import com.baidu.demo.controller.tool.HttpClientUtil2;
import com.baidu.demo.util.TokenUtil;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class GetTokenTask {

    public void getToken(){
        System.err.println("token....");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("apiKey","dc8cfd3022326d91");
        jsonObject.put("phone","18100366586");
        jsonObject.put("apiSecret","U2FsdGVkX18flru9PHgEvF9Gmlc9dI67qG4Tt1XZU+M=");


        HttpClientUtil2 httpClientUtil2 = new HttpClientUtil2();

        String result = httpClientUtil2.doPost("http://140.249.50.65:22/phone/auth", String.valueOf(jsonObject));
        System.out.println("返回数据:"+result);
        JSONObject resultJson = JSONObject.parseObject(result);

        String token = resultJson.getString("data");
        System.err.println(token);
        TokenUtil.token.setToken(token);
    }
}

三、将解析到的token 放入全局的作用域。

1、通过创建token 的工具类,将token放入全局作用域

Config包

package com.baidu.demo.config;

public class TokenEntity {
    public String token;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

util包

package com.baidu.demo.util;

import com.baidu.demo.config.TokenEntity;

public class TokenUtil {
    public static TokenEntity token = new TokenEntity();
}

这样就可以通过 TokenUtil.token.getToken() 获取token数据了;

四、修改工具类

1、其他接口拿到token之后才能访问数据

上面只是通过工具类拿到token,但是其他的接口都需要拿到token之后,才能放回数据。所以上面的工具类需要修改。

2、最终工具类

1、doPost方法(下面的第一张图片,是每一个接口要拿到token之后才能方位的方法)
2、doPostToken方法(是登录 接口返回token 的方法)
在这里插入图片描述

package com.baidu.controller.tool;


import com.baidu.util.TokenUtil;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * jdk 调用第三方接口
 * @author hsq
 */
@Component
public class HttpClientUtil2 {


    /**
     * 以post方式调用对方接口方法
     * @param pathUrl
     */
    public static String doPost(String pathUrl, String data){
        OutputStreamWriter out = null;
        BufferedReader br = null;
        String result = "";
        try {
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"POST",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("POST");

            //设置30秒连接超时
            conn.setConnectTimeout(1000000000);
            //设置30秒读取超时
            conn.setReadTimeout(1000000000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
            conn.setRequestProperty("Authorization", TokenUtil.token.getToken());  //维持长链接

//            application/json;charset=utf-8;
            conn.setRequestProperty("Content-Type", "application/json");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的三句代码,就是调用第三方http接口
             */
            //获取URLConnection对象对应的输出流
            //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //发送请求参数即数据
            out.write(data);
            //flush输出流的缓冲
            out.flush();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null){
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (out != null){
                    out.close();
                }
                if (br != null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }


    public static String doPostToken(String pathUrl, String data){
        OutputStreamWriter out = null;
        BufferedReader br = null;
        String result = "";
        try {
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"POST",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("POST");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接

//            application/json;charset=utf-8;
            conn.setRequestProperty("Content-Type", "application/json");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的三句代码,就是调用第三方http接口
             */
            //获取URLConnection对象对应的输出流
            //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //发送请求参数即数据
            out.write(data);
            //flush输出流的缓冲
            out.flush();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null){
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (out != null){
                    out.close();
                }
                if (br != null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    /**
     * 以get方式调用对方接口方法
     * @param pathUrl
     */
    public static String doGet(String pathUrl){
        BufferedReader br = null;
        String result = "";
        try {
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"GET",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("GET");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存(get可以不使用)
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String str = "";
            while ((str = br.readLine()) != null){
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (br != null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

五、定时任务

1、定时拉取数据到自己的数据库

https://juejin.cn/post/6844903968292732941
1、在启动类上开启定时任务的注解 @EnableScheduling
2、在需要调用的方法上加上@Scheduled 注解

下面的意思是每5分钟去调用这个方法。(这个方法里面写了添加到自己数据库的操作)

@Slf4j
@Component
@Transactional(rollbackFor = Exception.class)
public class ConnectTeamTask {

    @Autowired
    private AlarmListTool alarmListTool;


    @Scheduled(cron = "0 0/5 * * * ? ")
    public void clearTodayHotDistrict() {

         alarmListTool.alarmList(0);
         alarmListTool.alarmList(1);
         alarmListTool.alarmList(2);

    }
}

cron 在线生成器,若依框架上也有
https://cron.qqe2.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Feign远程调用

Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https://github.com/OpenFeign/feign Fegin的使用步骤如下&#xff1a; 1&#xff09;引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-clou…

Win11开始菜单里面的推荐项目怎么全部关闭教学

Win11开始菜单里面的推荐项目怎么全部关闭教学分享。在Win11系统的开始菜单中&#xff0c;有一些推荐的功能程序。这些程序用户平时并没有使用到&#xff0c;所以想要去将它们进行关闭。那么这些程序如何彻底的关闭显示呢&#xff1f;一起来看看关闭的方法吧。 操作方法&#x…

[附源码]计算机毕业设计咖啡销售平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[设计] Doris血缘解析流程

一、背景 1.1 元数据概述 元数据是凌久中台重要功能模块&#xff0c;是数据治理的重要一环&#xff0c;元数据治理是一切数据治理的基础&#xff0c;主要分为元数据管理和表血缘管理&#xff1b; 元数据管理主要用来做数据地图、数据资产等&#xff1b; 血缘治理主要用来追查…

爬虫-(5)

内容概览 scrapy架构介绍scrapy解析数据settings相关配置持久化方案爬取全站文章爬虫中间件与下载中间件 scrapy架构介绍 # 引擎(ENGINE) 引擎负责控制系统所有组件之间的数据流&#xff0c;并在某些动作发生时触发事件。有关详细信息&#xff0c;请参见上面的数据流部分。# …

SLURM批处理调度系统介绍

SLURM (Simple Linux Utility for Resouce Management) 非常成熟的开源社区集群批处理调度系统。 介绍 2008年左右起源于LLNL实验室, 最新版本20.11开源软件(约50万行c源码)&#xff0c;开发和发布一直活跃用户群: Top10里有5家使用(天河HPC是其一)商业公司SchedMD提供顾问咨…

经典算法之LRU算法

一、理论 LRU算法算是个常见的算法&#xff0c;很有必要去了解它&#xff0c;现在我们就来看看什么是 LRU LRU 的全称是 Least Recently Used&#xff08;最近最少使用&#xff09;&#xff0c;就如它的含义一样&#xff0c;最近最少使用的。在实际的场景中大多会把它当作一种…

CAN总线学习笔记 | STM32CubeMX配置CAN环回测试

CAN基础知识介绍文中介绍了CAN协议的基础知识&#xff0c;以及STM32F4芯片的CAN控制器相关知识&#xff0c;下面将通过实例&#xff0c;利用STM32CubeMX图形化配置工具&#xff0c;来实现CAN通讯的环回测试 一、STM32CubeMX配置 CAN是挂载在APB1总线上&#xff0c;设置PCLK1时…

Flink系列之Flink中四层Graph详解

title: Flink系列 四、Flink Runtime 四层 Graph 详解 首先回顾一下 Flink 的整体架构设计&#xff1a; {% asset_img processes.svg %} 关于上图中的一些概念的解释&#xff1a; 1、DataFlow Graph 是一个逻辑概念&#xff0c;表示这个应用程序的一个执行图&#xff0c;事…

开关电源环路笔记(11)-TL431电路的几个电阻的取值

上次文章发出来后&#xff0c;有兄弟留言布置了作业&#xff0c;让说说几个电阻的取值&#xff0c;就是下图的Rled&#xff0c;Rbias&#xff0c;R1&#xff0c;Rlower等。那么就写写吧&#xff0c;毕竟&#xff0c;这个电路确实用得非常多&#xff0c;实际工作中确实也需要知道…

登录信息记录模块实现(UserAgentUtils)

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 一、UserAgentUtils简介 user-agent-utils 是一个用来解析 User-Agent 字符串的 Java 类库。 其能够识别的内容包括&#xff1a…

32_STM32内部温度传感器实验

目录 内部温度传感器简介 STM32ADC对应引脚 内部温度传感器使用注意使用事项 开启内部温度传感器步骤 实验源码 内部温度传感器简介 内部温度传感器框图 从图上可以看出温度传感器可通过TSVREFR控制位连接到ADC的固定通道16,温度的值最终肯定是被转换成电压值,电压值然后通…

学会python这十个语言技法,让你有上手风范

如何让你的代码更有python味&#xff1f; 大部分编程语言都有共性&#xff0c;也有个性。下手害怕个性&#xff0c;视为异端&#xff0c;抵触之&#xff1b;上手善用个性&#xff0c;欣欣然&#xff0c;妙用之。 1、三元表达式 别抱怨python没有三元表达式&#xff0c;请看&…

《大数据导论》之数据的概念、类型和组织形式

目录 说在前面 一、数据的概念 二、数据类型 ​三、数据组织形式 说在前面 大数据时代悄然来临&#xff0c;带来了整个信息技术发展的巨大变革&#xff0c;并深刻影响着社会生产和人们生活的方方面面。全球范围内&#xff0c;世界各国政府也非常重视整个大数据的研究和产业…

hadoop pig-0.17.0 安装配置

下载Apache Pig 首先&#xff0c;从以下网站下载最新版本的Apache Pig&#xff0c;下载Pig步骤取自W3C&#xff1a;Pig安装教程 步骤1 打开Apache Pig网站的主页。在News部分下&#xff0c;点击链接release page&#xff08;释放&#xff09;&#xff0c;如下面的快照所示。 步…

解决git中出现的“bash syntax error near unexpected token ’(‘”错误

今天来分享一篇关于我在git使用过程中出现的一个错误。 错误信息&#xff1a; bash: syntax error near unexpected token (’ 翻译过来就是提示我在’(这里有错误&#xff0c;而这个错误是我在使用git commit提交时候产生的&#xff0c;我当时是这么写的&#xff1a; git c…

java中Optional的应用,以及map和flatMap的区别

关于Option的介绍可以看深入理解java8中的Optional 类就可以了&#xff0c;但是复杂一点的使用在网上却没有搜到&#xff0c;这里结合我开发时遇到的真实案例来讲一下Option的使用。 1.案例一 在真实业务操作过程中&#xff0c;都是对象里面套对象&#xff0c;这边先简单定义操…

flink window 框架详细解读

1. dataStream window group window time window 基于时间驱动 滚动时间窗口 tumble time window 滑动时间窗口 sliding time window 会话时间窗口 session time window count window 基于数据驱动 滚动计数窗口 tumble count window 滑动计数窗口 sliding count window 2. s…

皕杰报表之雷达图

雷达图&#xff08;又可称为戴布拉图、螂蛛网图&#xff09;是数据分析报表的一种。即将各项数据分析所得的数字或比率&#xff0c;就其比较重要的项目集中划在一个图表上&#xff0c;来表现一组数据的各项数据比率的情况&#xff0c;使用者能一目了然的了解这个数据的指标的变…

LeetCode中等题之通过最少操作次数使数组的和相等

题目 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间&#xff08;包含 1 和 6&#xff09;。 每次操作中&#xff0c;你可以选择 任意 数组中的任意一个整数&#xff0c;将它变成 1 到 6 之间 任意 的值&#xff08;包含 1 和 6&#…