天天看點

SpringBoot+HttpClient+JsonPath提取A接口傳回值作為參數調用B接口

前言

在做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(value = "categoryName")

    如果是問号後面拼的參數 這個用@RequestParam來取,告訴

    springboot

    這個

    name

    對應的就是參數中的

    categoryName

    ,就是說前端頁面給你傳的參數名叫

    categoryName

    但是你代碼中寫的變量名是

    name

    如果不加這個參數 是接收不到的 是以需要注解映射
  • CommonResponse.successInstance(categoryList)

    通用傳回值,傳回成功

    message

    ,傳回資料

    data

    ,傳回總條數

    count

其次,我們需要提取/

getCategoryBookList

接口傳回的bookName值

SpringBoot+HttpClient+JsonPath提取A接口傳回值作為參數調用B接口

使用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值

SpringBoot+HttpClient+JsonPath提取A接口傳回值作為參數調用B接口

接下來,我們先看下下一個接口

/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 String bookName

    @PathVariable是取url中的變量 ,會自動進行指派拼接在URL後面

将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請求,已經成功傳回了第二個接口的傳回值

SpringBoot+HttpClient+JsonPath提取A接口傳回值作為參數調用B接口

到此就大功告成,完成了HttpClient+JsonPath提取響應值作為多個接口請求參數,解決多業務依賴關聯