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(令牌),是访问数据的关键
如何获取数据:
- 实时访问:需要积分的至少120起需要通过RestTemplate接口发送和接收信息。- 历史数据访问:不需要积分。直接下载成csv文件
下载好的csv文件信息
实时数据访问
获取数据字符串
导入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>
- 使用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文件
OpenCSV
完成Java程序和CSV之间的互通。
- 导入OpenCSV环境:
<dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>5.7.1</version>
</dependency>
- 使用OpenCSV进行解析
在resources下新建csvdata包—在csvdata包下新建文件 stock_basic,把.txt后缀改为.csv
以下两种方式均可进行解析
/**
* 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);}
}