12.SpringBoot之RestTemplate的使用

SpringBoot之RestTemplate的使用

初识RestTemplate

  • RestTemplate是Spring框架提供用于调用Rest接口的一个应用,它简化了与http服务通信方式。RestTemplate统一Restfull调用的标准,封装HTTP链接,只要需提供URL及返回值类型即可完成调用。相比传统的HttpClient与Okhttp,
    RestTemplate是一种优雅,简洁调用RESTfull服务的方式。

  • RestTemplate默认依赖JDK提供Http连接的能力(HttpURLConnection),如果有需要的话也可以通过SetRequestFactory方法替换为如:Apache
    HttpComponents、Netty或OKHttp等其他HTTP库。

本项目中所需数据获取平台:Tushare股票数据获取平台

tushare数据接口讲解

获取自己的token(令牌),是访问数据的关键
01
如何获取数据:
02

03
04

- 实时访问:需要积分的至少120起需要通过RestTemplate接口发送和接收信息。- 历史数据访问:不需要积分。直接下载成csv文件

05
下载好的csv文件信息
06

实时数据访问

获取数据字符串

导入RestTemplate工具

  • 在Demo20230830Application中向spring注册RestTemplate工具
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication
@EnableSwagger2
public class Demo20230830Application {public static void main(String[] args) {SpringApplication.run(Demo20230830Application.class, args);}/*** 向spring注册RestTemplate工具* @return*/@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
  • 使用RestTemplate工具向tushare网站接口发送请求,从其接口中接收响应信息。
  • 在controller包下创建MyController2,在MyController2中输入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/my2")
public class MyController2 {//将RestTemplate工具导入到当前控制器中@AutowiredRestTemplate restTemplate;@RequestMapping("/r1")public void r1(){//1、封装map参数HashMap<String, String> map = new HashMap<>();map.put("api_name","stock_company");map.put("token","你自己的token");//2、设置请求头信息HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);//3、封装头实体内容HttpEntity<Map> entity = new HttpEntity<>(map, httpHeaders);//4、传递信息String str = restTemplate.postForObject("http://api.tushare.pro", entity, String.class);System.out.println(str);}
@RequestMapping("/r2")
public void r2(){//1、封装map参数HashMap<String, String> map = new HashMap<>();map.put("api_name","stock_basic");map.put("token","你自己的token");//2、设置请求头信息HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);//3、封装头实体内容HttpEntity<Map> entity = new HttpEntity<>(map, httpHeaders);//4、传递信息String str = restTemplate.postForObject("http://api.tushare.pro", entity, String.class);System.out.println(str);
}}

Fastjson转为json

从tushare获取到的数据 复杂的json格式数据,如果我们自己进行String的数据解析,消耗大量时间。
程序员会使用JSON工具,将字符串转为json,或将json转为其他数据类型。
  • 引入fastjson
    在pom.xml文件中引入,引入之后记得更新maven,不然不会生效
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.17</version>
</dependency>

07

  • 使用fastjson
/**
* fastjson的转换展示
*/
@RequestMapping("/r3")
public void r3(){//1、封装map参数HashMap<String, String> map = new HashMap<>();map.put("api_name","stock_basic");map.put("token","你自己的token");//2、设置请求头信息HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);//3、封装头实体内容HttpEntity<Map> entity = new HttpEntity<>(map, httpHeaders);//4、传递信息String str = restTemplate.postForObject("http://api.tushare.pro", entity, String.class);//5、JSON转换JSONObject jsonObject = JSONObject.parseObject(str);//获取请求id(测试用)String requestId = jsonObject.getString("request_id");//获取本次的所有数据JSONObject data = jsonObject.getJSONObject("data");//获取表头(数组)JSONArray fields = data.getJSONArray("fields");//fields.forifor (int i = 0; i < fields.size(); i++) {System.out.print(fields.get(i)+"\t\t");}System.out.println();//获取表格内部数据JSONArray items = data.getJSONArray("items");for (int i = 0; i < items.size(); i++) {JSONArray jsonArray = items.getJSONArray(i);//展示这一行的数据for (int j = 0; j < jsonArray.size(); j++) {System.out.print(jsonArray.get(j)+"\t\t");}System.out.println();}
}
小结:
获取的是{"k1":"v1","k2":"v2"} json格式,获取其中k2的值,v2
JSONObject获取的是["a1","a2","a3"] json格式,获取其中a2
JSONArray

历史数据访问

导出csv文件

在Tushare数据平台导出csv文件
08
导出的csv文件命名为stock_basic.csv

OpenCSV

完成Java程序和CSV之间的互通。

  • 导入OpenCSV环境:
<dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>5.7.1</version>
</dependency>

08

  • 使用OpenCSV进行解析
    在resources下新建csvdata包—在csvdata包下新建文件 stock_basic,把.txt后缀改为.csv
    09
    以下两种方式均可进行解析
/**
* openCSV
*/
@RequestMapping("/r4")
public void r4(){try(FileReader reader = new FileReader("D:\\\\project\\yanan_20230828\\demo_20230830\\src\\main\\resources\\csvdata\\stock_basic.csv"); //这里是刚新建stock_basic.csv文件的地址) {CSVReader csvReader = new CSVReader(reader);List<String[]> list = csvReader.readAll();for (String[] arr : list) {//展示某一行的数据for (String s : arr) {System.out.print(s+"\t\t");}System.out.println();}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (CsvException e) {throw new RuntimeException(e);}
}
/**
* openCSV
*/
@RequestMapping("/r5")
public void r5() {File file;try {file = ResourceUtils.getFile("classpath:csvdata/stock_basic.csv");} catch (FileNotFoundException e) {throw new RuntimeException(e);}try (FileReader reader = new FileReader(file);) {CSVReader csvReader = new CSVReader(reader);List<String[]> list = csvReader.readAll();for (String[] arr : list) {//展示某一行的数据for (String s : arr) {System.out.print(s + "\t\t");}System.out.println();}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (CsvException e) {throw new RuntimeException(e);}
}

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

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

相关文章

Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍

工作流程&#xff1a; Driver 创建 SparkSession 并将应用程序转化为执行计划&#xff0c;将作业划分为多个 Stage&#xff0c;并创建相应的 TaskSet。Driver 将 TaskSet 发送给 TaskScheduler 进行调度和执行。TaskScheduler 根据资源情况将任务分发给可用的 Executor 进程执…

DAE转换GLB格式

1、DAE模型介绍 DAEA&#xff08;Deep Attentive and Ensemble Autoencoder&#xff09;模型是一种用于无监督学习的深度学习模型&#xff0c;由华为公司提出。DAEA模型结合了自编码器和深度注意力机制&#xff0c;能够对高维数据进行降维和特征提取&#xff0c;并且在处理大规…

博图数值按照特定格式(“T000000”)转换成字符串

一、前言 1.string to dint物流输送线往往需要通过扫码器读取托盘条码&#xff0c;一维码或者二维码​。 读取的数据需要解析才能正常使用。两种方式读取的数据直接是字符串&#xff0c;但当设备与上位机通信时&#xff0c; 字符串数据量太大&#xff0c;故可以通过算法转换成…

Ceph分布式存储的简单介绍与Ceph集群的部署搭建

文章目录 1. 存储的概述1.1 单机存储设备1.1.1 DAS&#xff08;直接附加存储&#xff09;1.1.2 NAS&#xff08;网络附加存储&#xff09;1.1.3 SAN&#xff08;存储区域网络&#xff09; 1.2 单机存储的缺陷1.3 分布式存储&#xff08;软件定义的存储 SDS&#xff09;1.4 分布…

unity ugui text 超链接和下划线,支持部分富文本格式

unity版本&#xff1a;2021.3.6f1 局限性&#xff1a; 1.测试发现不能使用 size 富文本标签, 2.同一文本不能设置不同颜色的超链接文本 其它&#xff1a;代码中注释掉使用innerTextColor的地方&#xff0c;可以使用富文本设置超链接颜色&#xff0c; 但是下划线是文本本身颜色 …

windows部署django服务器

windows部署django服务器 1、安装IIS1.1 控制面板-----程序----程序和功能----启用或关闭windows功能1.2安装IIS服务器&#xff0c;完成后&#xff0c;重新进入&#xff0c;把CGI安装进系统 2、安装python与虚拟环境2.1 安装python2.2 安装virtualenv虚拟环境2.3 创建一个虚拟环…

求二叉树的高度——函数递归的思想

二叉树的高度&#xff1a;左右两个数最高的那个的1 int TreeHight(BTNode* root) {if (root NULL){return 0;}int lefhightTreeHight(root->left);int righthight TreeHight(root->right);return lefhight > righthight ? TreeHight(root->left) 1 : TreeHight…

想要精通算法和SQL的成长之路 - 连续的子数组和

想要精通算法和SQL的成长之路 - 连续的子数组和 前言一. 连续的子数组和1.1 最原始的前缀和1.2 前缀和 哈希表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 连续的子数组和 原题链接 1.1 最原始的前缀和 如果这道题目&#xff0c;用前缀和来算&#xff0c;我们的思路…

雷电模拟器上使用第一个frida(三)简单的使用实例

经过前两篇 雷电模拟器上使用第一个frida&#xff08;一&#xff09;之安装-CSDN博客雷电模拟器上使用第一个frida&#xff08;二&#xff09;之su超级权限-CSDN博客 本篇开始记录如何使用frida进行hook。 一、先让手机模拟器端的frida server运行起来 虽然是让手机模拟器端…

Rust 流程控制

开发中最常见的用来控制执行流的结构是判断和循环。 判断 Rust 中的 if 表达式允许根据条件执行不同的代码分支&#xff0c;提供一个条件并表示 “如果条件满足&#xff0c;运行这段代码&#xff1b;如果条件不满足&#xff0c;不运行这段代码。” 需要注意的是&#xff0c;…

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)

十一、计划任务与Queue队列实践&#xff1a; 1. 计划任务&#xff1a; Linux环境下定时或者周期性的执行一些任务通常由cron这个守护进程来完成&#xff0c;这是一个系统自带的相对也比较方便的系统工具。 sudo apt-get install cron // 默认自带目录结构&#xff1a; 目录说…

驾驶数字未来:汽车业界数字孪生技术的崭新前景

随着数字化时代的到来&#xff0c;汽车行业正经历着前所未有的变革。数字孪生技术&#xff0c;作为一种前沿的数字化工具&#xff0c;正在为汽车行业带来革命性的影响&#xff0c;不仅改变着汽车制造和维护的方式&#xff0c;也为消费者带来了前所未有的体验。让我们一起探讨&a…

算法通过村第十四关-堆|白银笔记|经典问题

文章目录 前言在数组中寻找第K大的元素堆排序原理合并K个排序链表总结 前言 提示&#xff1a;想要从讨厌的地方飞出来&#xff0c;就得有藏起来的翅膀。 --三岛由纪夫《萨德侯爵夫人》 这里我们主要看一下经典的题目&#xff0c;这三个题目来说都是堆的热点问题。重点再理解处理…

SpringMVC之WEB-INF下页面跳转@ModelAttributeIDEA tomcat控制台中文乱码问题处理

WEB-INF下页面跳转 ModelAttribute来注解非请求处理方法 用途&#xff1a;预加载数据&#xff0c;会在每个RequestMapping方法执行之前调用。 特点&#xff1a;无需返回视图&#xff0c;返回类型void IDEA tomcat控制台中文乱码问题处理 复制此段代码&#xff1a;-Dfile.e…

有 AI,无障碍,AIoT 设备为视障人群提供便利

据世界卫生组织统计&#xff0c;全球共 22 亿人视力受损&#xff0c;包含 2.85 亿视障人群和 3,900 万全盲人群。而且&#xff0c;这一数字将随老龄化加剧不断增加。 虽然视障人群面临着诸多不便&#xff0c;但是针对视障人群的辅助设备却存在成本高、维护困难、操作复杂等问题…

【传输层协议】UDP/TCP结构特点与原理(详解)

文章目录 1. UDP1.1 UDP结构1.2 UDP特点1. 无连接2. 不可靠3. 面向数据报4. 缓冲区5. 大小受限6. 无序性 2. TCP2.1 TCP结构2.2 TCP特点1. 有连接2. 可靠性3. 面向字节流4. 拥塞控制5. 头部开销 2.3 TCP原理1. 确认应答&#xff08;安全机制&#xff09;2. 超时重传&#xff08…

爬虫 | 基础模块了解

文章目录 &#x1f4da;http协议&#x1f4da;requests模块&#x1f4da;re模块&#x1f407; re.I 或 re.IGNORECASE&#x1f407;re.M或 re.MULTILINE&#x1f407;re.S 或 re.DOTALL&#x1f407; re.A 或 re.ASCII&#x1f407; re.X 或 re.VERBOSE&#x1f407;特殊字符类…

攻防世界数据逆向 2023

https://adworld.xctf.org.cn/contest/list?rwNmOdr1697354606875 目录 请求数据参数加密 cookie加密 响应数据解密 代码 请求数据参数加密 我们可以根据请求的关键字qmze1yzvhyzcyyjr获取到对应的加密地方 可以看到使用了函数_0x1dc70进行了加密 cookie加密 该步骤需…

SpringBoot面试题4:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个? Spring Boot支持多种日志框架,包括以下几种: Logback:Logback 是一个快速、灵活…

面试总结(mysql定精度/oom排查/spring三级缓存/stream流)

Mysql数据类型上的一个把握 1、MySQL Decimal为什么不会丢失精度 DECIMAL的存储方式和其他数据类型都不同&#xff0c;它是以字符串形式存储的。假设一个字段为DECIMAL(3,0)&#xff0c;当我们存入100时&#xff0c;实际上存入的1、0、0这三个字符拼接而成的字符串的二进制值&…