java springboot调用第三方接口 借助hutoool工具类 爬坑
楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh、ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频,大概看了几个老师讲的,最后选了尚硅谷的视频,老师讲的很好,有点偏向底层源码解析,讲的很细,对我这个新手小白来说也不知道好不好,反正我就是跟着看了。最近接到超哥布置的一个任务,spring boot调用第三方接口,下面就讲讲我这个新手小白是怎么一步一步磕出来结果的,顺便记录一下,免得我后面忘了。
首先描述一下我的任务,也是需求。
传一个设备序列号deviceSerial,调用萤石平台https://open.ys7.com/第三方接口,获取到这个设备对应的高清播放地址rtmp。
话不多说,先上代码。
pom文件:主要是添加了hutool和fastjson的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.0</version>
</dependency>
配置application.yml
server:
port: 8081
system:
url: https://open.ys7.com
工具类MyProps:主要是获取配置文件中的第三方接口url
@Component
@ConfigurationProperties(prefix="system")
public class MyProps {
public String url;
public String getUrl() {
return url;
}
public MyProps setUrl(String url) {
this.url = url;
return this;
}
}
调用的controller
@RestController
@RequestMapping("/user")
public class TokenController { @Autowired
private MyProps myProps; @PostMapping("/token")
public String getToken() throws Exception{
Map<String,Object> map = new HashMap<String,Object>();
map.put("appKey","123456123456");
map.put("appSecret","654321654321");
String tokenStr = "";
try{
tokenStr = HttpUtil.post(myProps.getUrl()+"/api/lapp/token/get",map);
}catch (Exception e){
e.printStackTrace();
throw new Exception("第三方接口异常");
}
com.alibaba.fastjson.JSONObject jsonTokenStr = JSON.parseObject(tokenStr);
System.out.println(JSON.toJSONString(jsonTokenStr));
String data = jsonTokenStr.getString("data");
com.alibaba.fastjson.JSONObject jsondata = JSON.parseObject(data);
String accessToken = jsondata.getString("accessToken");
return accessToken;
} @PostMapping("/rtmp")
public String getRtmp(@RequestParam(required = true) String deviceSerial){
Map<String,Object> paramsMap = new HashMap<String,Object>();
paramsMap.put("accessToken","at.123456123456");
paramsMap.put("pageStart",0);
paramsMap.put("pageSize",3);
String result = "";
result = HttpUtil.post(myProps.getUrl()+"/api/lapp/live/video/list",paramsMap);
com.alibaba.fastjson.JSONObject jsonresult= JSON.parseObject(result);
System.out.println(jsonresult.toString());
// String data = jsonresult.getString("data");
// return data;
JSONArray ja = jsonresult.getJSONArray("data");
for(int i = 0; i < ja.size(); i++){
com.alibaba.fastjson.JSONObject jo = ja.getJSONObject(i);
System.out.println(jo.getString("deviceSerial"));
if(deviceSerial.equals(jo.getString("deviceSerial"))){
return jo.getString("rtmp");
}
}
return "找不到该设备";
}
}
再贴一下整个代码的目录结构,项目用maven构建,然后启动即可。
接下来就讲讲小白是怎么一步步磕出来结果的。
刚接到这个任务的时候,我其实是很懵逼的,因为确实spring boot看视频才刚搞清楚一个maven工程的目录结构,哪里修改配置这些东西。这一下子就让我调第三方接口,我真的一点概念都没有,就只能疯狂百度。你知道对于一个新手来说,最尴尬的是百度的时候,不知道关键词,所以检索的很不精准。像我什么概念都不知道,百度就只能锁定关键词java springboot 调用第三方接口,然后就出来一大堆springboot整合RestTemplate调用第三方接口的教程。刚一开始我确实是尝试用restTemplate来写,但可能真的是我太菜了,看不懂那些教程,跟着走了但是项目一直标红报错,进行不下去。好不容易不标红了,启动项目,在浏览器中只能看到Whitelabel Error Page There was an unexpected error (type=Method Not Allowed, status=405). Request method 'GET' not supported,这个提示其实很明显了对吧。萤石平台的第三方接口请求方式是POST,所以直接在浏览器中输入接口地址根本看不到返回的数据结果。然后我又懵逼了,因为我不知道请求方式是POST该怎么处理,卡了好半天,才想到用Postman来测接口,我是真的有点笨哦。然后我就装了一个Postman,按照萤石官网的API接口文档试了一下,终于看到返回结果了。
在一大堆的RestTemplate教程中,突然看到一篇很清奇的博客,这里贴一下链接https://blog.csdn.net/weixin_42178134/article/details/85321736?tdsourcetag=s_pcqq_aiomsg,看完这个博客我渐渐的有点感觉了,于是就开始尝试,先写一个根据appKey和secret获取accessToken的方法,贴一下萤石官网这个接口的文档图片,这样方便看客知道我在说什么。
可以看到,调用这个接口要传appKey和appSecret两个参数,所以定义了一个map类型的变量,把这两个参数放到map集合中。这里不得不说hutool真的是一个很好的工具,封装了很多方法。HttpUtil是应对简单场景下Http请求的工具类封装,此工具封装了HttpRequest对象常用操作,可以保证在一个方法之内完成Http请求。这个是hutool的参考文档链接https://hutool.cn/docs/#/。文档中有示例,写的非常清楚,强推!
HttpUtil.post()方法返回的是一个字符串,这里需要把字符串转换成json对象,所以在pom.xml文件中添加了fastjson的依赖,用JSON.parseObject()方法即可。转成json对象后,就可以用json内置的各种方法了,getString()把key对应的value取出来。
不想写了,写了好多,反正最后的结果就是我成功的拿到了accessToken,然后仿照着这个方法写了获取高清地址rtmp的方法,因为这两个接口返回的数据格式还是不太一样的,所以中途遇到了一点点小问题。贴一个我觉得很好的java从JSONObject中取值的博客链接吧https://blog.csdn.net/kxj19980524/article/details/83718971?tdsourcetag=s_pcqq_aiomsg,大家看看就明白了。
还有就是获取rtmp的方法,必须要传一个设备序列号,所以要加上@RequestParam,默认值是true,必须要传,不传就报错。有的方法可传可不传那就让required=false。
public String getRtmp(@RequestParam(required = true) String deviceSerial){...}
@RequestParam是直接从请求中取参,它是直接拼接在url后面的。
原来的url http://localhost:8081/user/rtmp
请求发出去之后拼接的url http://localhost:8081/user/rtmp?deviceSerial=1123456123456
楼主之前学的是前端,现在转后端,很多思考方式转变不过来。像这次接到这个任务,我就不是很懂为什么要让后端做,直接前端调第三方接口,然后拿到返回数据,再处理不就好了吗,又简单又方便。吃饭的时候,我把这个疑惑理所当然的抛给了超哥,结果超哥一句话就把我怼回来了,怎么能把appKey和secret这么重要的东西暴露在网页上面呢,果然楼主还是太青涩太年轻了。
如果这篇文章能帮到大家,我当然也是很开心的了。欢迎有志之士一起学习,楼主目前的状态是学习后端中,也不知道会学到多久。
java springboot调用第三方接口 借助hutoool工具类 爬坑的更多相关文章
- java代码调用第三方接口
一.利用httpclient来字符串参数(url是第三方接口,不带参数,如:http://192.168.16.200:8081/faceInfo/list,param是url后面所要带的参数) pu ...
- java从Swagger Api接口获取数据工具类
- Java调用第三方接口示范
在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...
- Java基础-Eclipse第三方安装包管理工具之Maven
Java基础-Eclipse第三方安装包管理工具之Maven 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 玩过Linux的小伙伴应该都知道yum吧,我们只要把搭建好的yum仓库配 ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- Java Class与反射相关的一些工具类
package com.opslab.util; import org.apache.log4j.Logger; import java.io.File;import java.io.IOExcept ...
- Java语言Lang包下常用的工具类介绍_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都 ...
- Java调用第三方接口工具类(json、form)
1.JSON值访问 /** * 调用对方接口方法 * @param path 对方或第三方提供的路径 * @param data 向对方或第三方发送的数据,大多数情况下给对方发送JSON数据让对方解析 ...
- 输入网址调用第三方接口获取结果_java
最近公司给了一个第三方服务的网址,要我调用后返回需要用到的信息 具体网址:http://www.xxxx.com/xxx-api/xxxx/getXxxByUserId?userId=" + ...
随机推荐
- WPF获取读取电脑指定文件夹中的指定文件的地址
//保存指定文件夹中的指定文件的地址 string List<string> mListUri = new List<string>(); //文件夹地址 string fol ...
- WPF响应长按事件
原文:WPF响应长按事件 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/78983140 思路:MouseD ...
- DWZ使用注意事项
DWZ使用注意事项 一.前言 在最近的一个项目,介绍DWZ丰富client框架,可以尝试一下.另外,在遇到的很多问题.十一终于攻克. 特别说明本文的. 本人用的是dwz-ria-1.4 ...
- MVC基架生成的Detele视图
@model MyMusicStore.Models.Album @{ ViewBag.Title = "Delete"; } <h2>Delete</h ...
- jquery属性过滤器
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- MVVM讲解
一,MVVM理论知识 从上一篇文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通 ...
- jquery 可以给事件传参数
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 教你干掉win10全家桶
原文: 教你干掉win10全家桶 这些并不好用的自带应用例如:groove音乐,相片,股票……一直占据着我们的默认应用.如果它们是一直静静的躺在那里还好,最多不用就是了.当我们想要浏览图片或者看视频的 ...
- windows media player 播放视频
一.新建windows应用程序项目,添加vedioForm窗体 二.在com组件中找到windows media player,添加引用 三.代码如下: public partial class Ve ...
- 卸载win10内置windows app的方法
原文:卸载win10内置windows app的方法 2015年,微软推出了windows10操作系统,其以漂亮的界面.良好的操作方式.方便的推送升级迅速获得了好多人的好评,因此,好多同学都换了win ...