通過GET/POST方式獲取第三方接口的數據

前言

遇到一個項目,需要通過API去獲取數據,API接口的調用方式支持GET和POST。一開始不懂這個API具體是個啥,是需要我們自己設計還是說用戶給定,後續搜索明確是用戶自定義提供API接口,開發人員只需要獲取到API的url及調用這個API所需要的必要參數,然後分別以GET/POST方式連接API,通過API獲取數據返回即可。這塊對我來講是個新知識點和新的處理方式,所以進行簡單記錄。

參考鏈接

實現過程

1.1 確定測試的接口及相關參數

本次測試使用笑話大全API,接口URL及需要給定的參數見下圖:

由上圖的請求示例可知訪問這個API支持通過GET和POST方式訪問符合我們的要求。調用API需要url和請求參數,這個示例API需要的請求參數是apiKey和pagaSize,在網站中申請獲取apiKey,pageSize自定義即可。

下圖爲網站自帶的API獲取數據的功能。

1.2 通過GET方式獲取API接口數據(代碼參考鏈接,具體更多處理方法見上述鏈接)

在確定好API鏈接及參數後,設計實現GET方式獲取API數據

        //輸入字符緩衝流
        BufferedReader in = null;
        //StringBuffer存儲獲取到的數據
        StringBuffer result = null;
        //調用的api的接口地址和接口參數
        String apiUrl = apiPath+"?"+param;
        try {
            URL url = new URL(apiUrl);
            //打開和url之間的連接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //有關connection的通用配置
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            //設置連接方式爲GET
            connection.setRequestMethod("GET");
            connection.connect();
            result = new StringBuffer();
            //讀取連接輸入,使用默認utf-8的轉換輸入流,使用BufferedReader緩衝區提升讀取IO效率且readLine方法支持一次讀取一行
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            //讀取字符輸入緩衝流獲取讀取到的數據並存儲result中
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            return result.toString(); 
         //catch+finally部分
        

1.3 通過POST方式獲取API接口數據

        BufferedReader in = null;
        //輸出流,用來輸出接口的參數
        OutputStreamWriter out = null;
        StringBuffer result = null;
        //調用的api的接口地址
        String apiUrl = apiPath;
        try {
            URL url = new URL(apiUrl);
            //打開和url之間的連接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            //POST方式必要的配置
            connection.setDoInput(true);
            connection.setDoOutput(true);
            //設置連接方式爲POST
            connection.setRequestMethod("POST");
            connection.connect();
            // 獲取URLConnection對象對應的輸出流,並用OutputStreamWriter轉換輸出流,規定編碼規則爲utf-8
            out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
            // 發送API請求參數
            out.write(param);
            // flush輸出流的緩衝
            out.flush();
            result = new StringBuffer();
            //讀取URL的響應,規定轉換輸入流編碼默認爲utf-8
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            return result.toString();
            //catch+finally部分

1.4 分別測試GET方式和POST方式都成功獲取到了API的數據。結果如下

其中接口url和參數爲

測試成功,功能實現。

1.5 觀察輸出結果,我們只需要result,使用fastJson將String轉爲JSON並使用JSONObject類的靜態方法getJSONObject單純獲取result結果。

        //將String轉爲JSON格式
        JSONObject jsonObject = JSON.parseObject(result);
        //將JSON中的result提取出來
        JSONObject jsonResult = jsonObject.getJSONObject("result");
        System.out.println(jsonResult);

測試結果如下,由於上面給的接口測試機會用完,此處測試使用新申請的接口。

知識點總結:

1. URL類:類 URL 代表一個統一資源定位符,它是指向互聯網“資源”的指針。資源可以是簡單的文件或目錄,也可以是對更爲複雜的對象的引用,例如對數據庫或搜索引擎的查詢。

2. URLConnection類:代表應用程序和 URL 之間的通信鏈接。

3. HttpURLConnection類:支持 HTTP 特定功能的 URLConnection。每個 HttpURLConnection 實例都可用於生成單個請求,但是其他實例可以透明地共享連接到 HTTP 服務器的基礎網絡。請求後在 HttpURLConnection 的 InputStream 或 OutputStream 上調用 close() 方法可以釋放與此實例關聯的網絡資源,但對共享的持久連接沒有任何影響。如果在調用 disconnect() 時持久連接空閒,則可能關閉基礎套接字。

總結

拿到問題先搞懂裏面不懂的名詞,之後分析搜索解決問題並及時進行總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章