首先描述一下我的任務,也是需求。
傳一個設備序列號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接口文檔試了一下,終於看到返回結果了。

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
如果這篇文章能幫到大家,我當然也是很開心的了。歡迎有志之士一起學習,樓主目前的狀態是學習后端中,也不知道會學到多久。

