前言
在做java接口自動化中,我們常常需要依賴多個接口,A接口依賴B,C,D接口的響應作為請求參數;或者URL中的參數是從其他接口中提取傳回值作擷取參數這是必不可少的。那麼怎麼實作呢?下面就來介紹多業務依賴多接口的代碼思路。
思路:
1、先new一個
HttpClientUtils
對象,構造一個
queryParam
的
Map
用來放請求參數 ,再構造 一個
headers
的Map用來放請求頭
2、調用
get/post
請求 獲得請求傳回值
3、用
jsonpath
技術, 對A接口中的響應值
data
取出來
4、周遊擷取到的
list
然後
for
循環每條資料
5、
close
關閉HttpClientUtils對象 釋放資源
首先,我們來看下
getCategoryBookList
根據分類名稱查詢書籍接口 在
Controller
層代碼實作如圖所示
/**
* 根據分類名稱查詢書籍
*
* @return
*/
@GetMapping("/getCategoryBookList")
@ResponseBody
public CommonResponse<List<Book>> getCategoryBookList(@RequestParam(value = "categoryName") String name) {
List<Book> categoryList = bookService.getCategoryBookList(name);
CommonResponse response = CommonResponse.successInstance(categoryList);
return response;
}
代碼解釋
-
CommonResponse
這個類 是與前端互動用的 因為這個類裡面還有請求的statusCode msg
data,如果你想把
httpClient
調用接口的傳回值 返給前端
就将傳回值設定到CommonResponse的data中就行
-
如果是問号後面拼的參數 這個用@RequestParam來取,告訴@RequestParam(value = "categoryName")
這個springboot
對應的就是參數中的name
,就是說前端頁面給你傳的參數名叫categoryName
但是你代碼中寫的變量名是categoryName
如果不加這個參數 是接收不到的 是以需要注解映射name
-
通用傳回值,傳回成功CommonResponse.successInstance(categoryList)
,傳回資料message
,傳回總條數data
count
其次,我們需要提取/
getCategoryBookList
接口傳回的bookName值
使用JsonPath提取,代碼如下
@GetMapping("/returnHttpGet")
@ResponseBody
public CommonResponse returnHttpGet(@RequestParam(value = "categoryName") String categoryName) {
String url = "http://localhost:9527/book/getCategoryBookList";
HttpClientUtils client = new HttpClientUtils(null);
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/x-www-form-urlencoded");
Map<String, String> queryParam = new HashMap<>();
queryParam.put("categoryName", categoryName);
String result = "";
try {
result = client.get(String.class, url, queryParam, headers);
System.out.println(result);
//使用jsonpath取出響應資料中的bookName值
List<String> bookNames = JsonPath.read(result, "$.data.[*].bookName");
return CommonResponse.successInstance(bookNames);//這個return傳回來的值就是個json字元串,可以用jsonpath擷取了
client.close();
}
return CommonResponse.errorInstance(result);
}
我們來在浏覽器輸入URL請求,已經成功提取到了這個bookName值
接下來,我們先看下下一個接口
/getBookByBookName
在Controler層的代碼
/**
* 根據書的名稱擷取書籍資訊
* @param bookName
* @return
*/
@GetMapping("/getBookByBookName/{bookName}")
@ResponseBody
public CommonResponse<Book> getBookByBookName(@PathVariable String bookName){
Book bName = bookService.getBookByBookName(bookName);
CommonResponse response = CommonResponse.successInstance(bName);
return response;
}
代碼解釋
-
@PathVariable是取url中的變量 ,會自動進行指派拼接在URL後面@PathVariable String bookName
将bookName作為getBookByBookName`接口的請求參數,代碼如下
String result = "";
try {
result = client.get(String.class, url, queryParam, headers);
System.out.println(result);
//使用jsonpath取出響應資料中的bookName值
List<String> bookNames = JsonPath.read(result, "$.data.[*].bookName");
String bookName = "";
// for (String str : bookNames) {
// bookName = str; 這種周遊我注視掉了 每周遊一次書名就走一次請求 而且周遊出來的書名都不一樣
// }
String urls = "http://localhost:9527/getBookByBookName";
HttpClientUtils htp = new HttpClientUtils(null);
Map<String, String> header = new HashMap<>();
headers.put("Content-Type", "application/x-www-form-urlencoded");
Map<String, String> param = new HashMap<>();
param.put("bookName", bookNames.get(0));
String res = "";
try {
//将jsonpath取出的bookName作為請求參數
res = client.get(String.class, urls, param, header);
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
}
return CommonResponse.successInstance(bookNames);//這個return傳回來的值就是個json字元串,可以用jsonpath擷取了
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
return CommonResponse.errorInstance(result);
}
最後我們在浏覽器輸入URL請求,已經成功傳回了第二個接口的傳回值
到此就大功告成,完成了HttpClient+JsonPath提取響應值作為多個接口請求參數,解決多業務依賴關聯