java springboot調用第三方接口 借助hutool工具類 爬坑


 樓主是個后端小白一枚,之前沒接觸過后端,只學了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這么重要的東西暴露在網頁上面呢,果然樓主還是太青澀太年輕了。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM