SpringBoot+HttpClient+JsonPath提取A接口返回值作为参数调用B接口

2023-05-16

前言
在做java接口自动化中,我们常常需要依赖多个接口,A接口依赖B,C,D接口的响应作为请求参数;或者URL中的参数是从其他接口中提取返回值作获取参数这是必不可少的。那么怎么实现呢?下面就来介绍多业务依赖多接口的代码思路。

思路:
1、先new一个HttpClientUtils对象,构造一个queryParamMap用来放请求参数 ,再构造 一个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值
在这里插入图片描述
使用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 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请求,已经成功返回了第二个接口的返回值
在这里插入图片描述
到此就大功告成,完成了HttpClient+JsonPath提取响应值作为多个接口请求参数,解决多业务依赖关联

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot+HttpClient+JsonPath提取A接口返回值作为参数调用B接口 的相关文章

随机推荐

  • MySQL修改root密码的多种方法,你掌握了吗

    前言 我们在工作中都会用到mysql数据库 xff0c 也是最熟悉用的最多的 xff0c 无论是在本地安装mysql还是在Linux安装mysql xff0c 都需要给数据库配置用户名和密码 xff0c 时间一长我们就会忘记配置数据库的密码
  • 性能测试:数据库架构和SQL优化

    前言 有时候我们出去面试的时候 xff0c 会被问到是否有做过架构方面的优化 如果没有准备突然被问到的话通常会有点懵 那么我们这里来整理一下系统架构优化相关的知识 其实一般架构优化主要就分为数据库架构 xff0c 第二个就是应用程序架构 数
  • springboot整合mybatis实现增删改查

    前言 在学习Springboot过程中 xff0c 整合mybatis框架实现表数据的增删改查 xff0c 话不多说 xff0c 开始贴代码 xff01 Spring Boot提供了一个名为spring boot starter paren
  • 国内个人免费在SCI、IEEE等数据库下载文献方法

    膜拜CSDN上的大神们 xff0c 在技术和方法上为我们奉献的力量 xff01 xff01 xff01 xff01 1 打开IEEE官网 xff1a https ieeexplore ieee org Xplore home jsp 用英文
  • springboot读取yml文件中的list列表、数组、map集合和对象

    前言 springboot配置文件yml类型简单的风格 xff0c 十分受大家的欢迎 xff0c 支持字符string类型 xff0c 支持列表list类型 xff0c 支持集合map类型 xff0c 支持数组array类型 xff0c 支
  • JMeter 线上压测如何预防服务器被打挂

    通常我们在做线上压测的时候 xff0c 会遇到一个问题 xff0c 就是担心在线上压测的时候服务器被我们压挂掉 xff0c 由于是线上服务器 xff0c 挂掉之后再重启 xff0c 会比较麻烦 xff0c 因此 JMeter 提供了一个方法
  • JMeter 进行函数助手MD5加密

    JMeter 函数助手 MD5 加密 JMeter函数助手中 xff0c 提供了MD5加密的方法 xff0c 如图所示 xff0c 我们将内容 123456 进行加密 xff0c 可以看到加密成功了 下面我们来看看项目接口的请求参数 这是一
  • mysql监控sql执行情况

    要想进阶针对mysql学习乃至掌握mysql调优的基本技能 xff0c 监控mysql的执行情况必不可少 就像我们的代码 xff0c 如果不能debug xff0c 想要进行调优排错 xff0c 难度将会大大增加 所以今天我们就来讲解如何监
  • Linux搭建JMeter环境(超详细)

    安装JDK 官网链接 xff1a https www oracle com java technologies javase javase jdk8 downloads html 因为我虚拟机配置是arm xff0c 安装 Linux环境下
  • 性能测试:数据库连接池问题分析

    前言 今天我们来压测一个支付的接口 xff0c 10个并发 xff0c 压测5分钟 下面我们可以看到tps大概在200多 xff0c 响应时间在40ms左右 下面我们来看一下服务器的性能 xff0c 应用服务器的cpu使用率大概在60 左右
  • 解决docker容器时间和宿主机时间不一致问题

    新建容器之后 xff0c 发现容器的时间和宿主机的容器不一致 xff0c 我们先看一下宿主机的时间 xff0c 现在是北京时间 进入容器之后 xff0c 查看容器时间和宿主机的时间不一致 xff0c 因为我现在容器的时间已经正常了 xff0
  • 性能测试:数据库性能问题实战分析

    接口压测分析 现在我们来压测一个获取用户信息接口 xff0c 这个接口会涉及到数据库的数据查询 我们的项目是部署正在应用服务器上面的 xff0c 因此我们需要同时监控应用服务器和数据库服务器 那么下面我们来看一下tomcat的这台服务器 x
  • Springboot封装HTTPClient中get,post,json,put请求方法

    pom xml依赖如下 span class token operator lt span span class token operator span span class token operator span https span c
  • Python实现列表数据按字典key值嵌套排序

    前言 当实现Python列表中的嵌套数据 xff0c 需要对数据进行排序 xff0c 是不是脑海中已经思考各种for循环或者while循环列表中的数据 xff0c 然后对列表中的数据进行排序 xff1f 小编今天在做可视化图表统计自动化的时
  • qemu-img 将iso转换成qcow2/raw

    参考 xff1a moonfly KVM虚拟机导出最小化体积的qcow2镜像文件 qemu不能直接将iso转化成qcow2或者raw xff0c 但是使用iso创建虚机后会产生qcow2 raw作为虚机的硬盘 xff0c 因此 xff0c
  • mac pro M1(ARM)安装vmware虚拟机及centos8详细教程

    前言 mac发布了m1芯片 xff0c 其强悍的性能收到很多开发者的追捧 xff0c 但是也因为其架构的更换 xff0c 导致很多软件或环境的安装成了问题 xff0c 这次我们接着来看如何在mac m1环境下安装centos8 Centos
  • prometheus+grafana对数据库mysql监控

    安装 mysql span class token function docker span run span class token parameter variable name span mysql test span class t
  • 性能测试:Redis性能监控(redis-stat工具)

    redis 监控 redis 监控一共有两种方式 xff0c 一种是通过info命令 xff0c 还有一种是使用redis stat工具 两者其实本质是一样的 xff0c 不过一个是命令行的模式下查看监控数据 xff0c 而另外一种是图形化
  • springboot中controller层接收参数,servers层调用mapper层,一条sql搞定排序

    前言 很多小伙伴们在公司不管是测试C端产品还是B端产品 xff0c 都会测到排序的业务需求 xff1b 那么我们就会好奇排序是如何实现的呢 xff1f 下面我们开始介绍代码的实现 数据库建表 我们需要创建一个书籍book表结构 xff0c
  • SpringBoot+HttpClient+JsonPath提取A接口返回值作为参数调用B接口

    前言 在做java接口自动化中 xff0c 我们常常需要依赖多个接口 xff0c A接口依赖B xff0c C xff0c D接口的响应作为请求参数 xff1b 或者URL中的参数是从其他接口中提取返回值作获取参数这是必不可少的 那么怎么实