前言
遇到一個項目,需要通過API去獲取數據,API接口的調用方式支持GET和POST。一開始不懂這個API具體是個啥,是需要我們自己設計還是說用戶給定,後續搜索明確是用戶自定義提供API接口,開發人員只需要獲取到API的url及調用這個API所需要的必要參數,然後分別以GET/POST方式連接API,通過API獲取數據返回即可。這塊對我來講是個新知識點和新的處理方式,所以進行簡單記錄。
參考鏈接
- GET/POST方式調用HTTP接口:https://blog.csdn.net/CapMiachael/article/details/51833531?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 調用第三方接口獲取數據:https://blog.csdn.net/myme95/article/details/89359677?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 免費API獲取網站:https://www.apishop.net/#/
實現過程
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() 時持久連接空閒,則可能關閉基礎套接字。
總結
拿到問題先搞懂裏面不懂的名詞,之後分析搜索解決問題並及時進行總結。