首先描述一下我的任務,也是需求。
傳一個設備序列號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
如果這篇文章能幫到大家,我當然也是很開心的了。歡迎有志之士一起學習,樓主目前的狀態是學習后端中,也不知道會學到多久。