springboot vue测试平台接口定义及发送请求功能实现

目录
  • 基于 springboot+vue 的测试平台开发
    • 一、http客户端选型
    • 二、后端接口实现
      • 1. controller 层
      • 2. service 层
    • 三、前端实现
    • 四、修改遗留 bug

基于 springboot+vue 的测试平台开发

继续更新

添加的接口,我要来调试确定是否是通的,那么要发送接口请求,今天来实现这个功能,先预览一下:

捋一下思路,分为三步走:

点击发送按钮,调用后端接口后端接口处理内部,发送http接口请求后端接口把响应返回给前端展示

一、http客户端选型

为了更方便快捷的开发功能,直接选用 hutool 框架中封装好的 http客户端。

官方介绍:Hutool-http 针对JDK 的HttpUrlConnection做一层封装,简化了HTTPS请求、文件上传、Cookie记忆等操作,使Http请求变得无比简单。

Hutool-http的核心集中在两个类:

HttpRequest

HttpResponse

同时针对大部分情境,封装了HttpUtil工具类。根据Hutool的“便捷性与灵活性并存”原则,HttpUtil 的存在体现了便捷性,那 HttpRequest对象的使用则体现了灵活性,使用此对象可以自定义更多的属性给请求,以适应Http请求中的不同场景(例如自定义header、自定义cookie、自定义代理等等)。

看过介绍,我浏览了下源代码,然后测试了一下,发现可以满足我使用需求。

//    get1
    @Test
    void get1() {
        String result1 = HttpUtil.get("http://localhost:8080/bloomtest/user/useInfo?token=admin-token");
        System.out.println(result1);
    }
    //    get2
    @Test
    void get2() {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("id", 33);
        String result2 = HttpRequest.get("http://localhost:8080/bloomtest/apiDefinition/getApi")
                    .form(paramMap)
                    .execute()
                    .body();
        System.out.println(result2);
    }

比如,发送get请求,HttpUtil 其实是基于 HttpRequest 的进一步分装,我这里还是直接统一使用 HttpRequest 。

另外,发送 post 请求也很简单,可以直接传入 json 字符串:

@Test
    void testPost() {
        String reqBody = "{\n" +
                "    \"projectName\": \"项目zzz1\",\n" +
                "    \"description\": \"测试新增项目\"\n" +
                "}";

        //链式构建请求
        String result3 = HttpRequest.post("http://localhost:8080/bloomtest/project/add")
//                .header(Header.CONTENT_TYPE, "application/json")//头信息,多个头信息多次调用此方法即可
//                .timeout(20000)//超时,毫秒
                .body(reqBody)
                .execute().body();
    }

关于http请求的常用信息,请求头、参数、delete/put 等等其他方法,框架都是支持的,目前我只实现最基本的需求。

二、后端接口实现

测试过了上面的代码,心里就有数了,在后端接口里就看怎么使用它了。

这个发送请求的接口,目前需要支持如下:

get、post 方法查询参数(/list?id=3)、rest参数(/list/3)以及请求 body(json)

header暂时先不加,目前我项目里的接口都不需要传指定的 header,后期实现了权限之后再对应完善代码。

1. controller 层

ApiDefinitionController 类中继续新增处理器方法。

@PostMapping("/apiTestRun")
  public Result apiTestRun(@RequestBody ApiRunTestRequest apiRunTestRequest) {
      return Result.success(apiDefinitionService.apiTestRun(apiRunTestRequest));
  }

2. service 层

对应service层实现,先放出全部代码,目前还是以初期实现为主,代码后续可能会进一步优化:

public JSONObject apiTestRun(ApiRunTestRequest request) {

      // url 拼接
      String url = request.getHost() + request.getPath();
      // 判断不同请求参数类型:0 query参数,1 rest参数, 2使用 body参数
      int queryType = request.getRequestType();
      if (queryType == 0) {
          // query 参数
          HashMap<String, Object> paramMap = new HashMap<>();
          JSONArray jsonArray = JSONArray.parseArray(request.getRequest());
          for (int i=0; i<jsonArray.size(); i++) {
              paramMap.put(jsonArray.getJSONObject(i).get("queryKey").toString(), jsonArray.getJSONObject(i).get("value"));
          }
          if (request.getMethod().equals("get")) {
              String result = HttpRequest.get(url)
                      .form(paramMap)
                      .execute()
                      .body();
              return JSONObject.parseObject(result);
          }
          if (request.getMethod().equals("post")) {
              String result = HttpRequest.post(url)
                      .form(paramMap)
                      .execute()
                      .body();
              return JSONObject.parseObject(result);
          }
      } else if (queryType == 1) {
          // rest参数
          HashMap<String, Object> paramMap = new HashMap<>();
          JSONArray jsonArray = JSONArray.parseArray(request.getRequest());
          for (int i=0; i<jsonArray.size(); i++) {
              paramMap.put(jsonArray.getJSONObject(i).get("restKey").toString(), jsonArray.getJSONObject(i).get("value"));
          }
          // 去掉path后面的参数,还原path
          List<String> list = Arrays.asList(request.getPath().split("/\\{"));
          String orginPath = list.get(0);
          // 解析path中的参数,确认参数拼接顺序
          List<String> resultFindAll = ReUtil.findAll("(?<=\\{)(.+?)(?=\\})", request.getPath(), 0);
          String appendParamPath = "";
          for (String i : resultFindAll) {
              appendParamPath = appendParamPath.concat("/" + paramMap.get(i));
          }
          // 发送请求
          if (request.getMethod().equals("get")) {
              String result = HttpRequest
                      .get(request.getHost() + orginPath + appendParamPath)
                      .execute()
                      .body();
              return JSONObject.parseObject(result);
          }
          if (request.getMethod().equals("post")) {
              String result = HttpRequest
                      .post(request.getHost() + orginPath + appendParamPath)
                      .execute()
                      .body();
              return JSONObject.parseObject(result);
          }

      } else if (queryType == 2) {
          // 请求体
          if (request.getMethod().equals("post")) {
              String reqBody = request.getRequest();
              String result = HttpRequest.post(url)
                      .body(reqBody)
                      .execute().body();
              return JSONObject.parseObject(result);
          }
          // 请求体
          if (request.getMethod().equals("get")) {
              String reqBody = request.getRequest();
              String result = HttpRequest.get(url)
                      .body(reqBody)
                      .execute().body();
              return JSONObject.parseObject(result);
          }
      }
      return null;
  }

乍一看比较多,其实分开看就好:

  • 根据参数类型,分别对于 query、rest、body 的请求参数情况进行处理
  • 在其中每种类型里,又区分了 get、post 方法

简单介绍下其中各种的要点。

(1)query 参数

主要是前面的 2 步:

拿到前端的入参,解析成 JSONArray,内部元素类型又是 JSONObject

遍历 JSONArray,通过jsonArray.getJSONObject(i)方法获取各 JSONObject 的 key,对应前端入参的queryKey和value,就是参数名和参数值。

接着发送请求,拿到的返回是一个 String,解析成 JSONObject 返回给 controller

(2)rest 参数

处理 rest 参数稍微麻烦了些,比如:localhost:8080/bloomtest/module/list/3,最后的3才是参数。

处理过程就像我注视写的:

获取前端传来的参数

首先跟上面一样,获取到前端的参数名和值,放到 HashMap 里,熟悉 python的童鞋就当作放到字典里了。

解析path中的参数,确认参数拼接顺序

因为参数名需要跟 url 里的拼接的值顺序对应上才行,接口里保存的url是这样的:/bloomtest/module/list/{projectId},大括号里的就是参数。

所以这里使用了正则去匹配我要的内容,表达式(?<=\{)(.+?)(?=\})我搜的,具体我也不熟悉,后续再学习。

ReUtil.findAll方法也是来自于 hutool 框架,可以查找到所有符合表达式的内容,返回是一个数组。

然后遍历这个数组,把里面的参数逐个拼接到一个空字符串里appendParamPath:

String appendParamPath = "";
  for (String i : resultFindAll) {
      appendParamPath = appendParamPath.concat("/" + paramMap.get(i));
  }

去掉path后面的参数,还原path

因为前端传过来的 path 是/bloomtest/module/list/{projectId},需要去掉最后的/{projectId}才可以使用。

List<String> list = Arrays.asList(request.getPath().split("/\\{"));
  String orginPath = list.get(0);

使用了字符串分割split方法,返回的是一个String[]数组,又通过Arrays.asList进一步做了转化,就可以使用get(0)获取第一个使用了,也就是/bloomtest/module/list

前面都齐了,就可以发送请求了,注意最终请求的 url 还是要拼接一下:request.getHost() + orginPath + appendParamPath

(3)请求体

这个最简单,前端传过来的 json 字符串直接传入即可:

if (request.getMethod().equals("post")) {
      String reqBody = request.getRequest();
      String result = HttpRequest.post(url)
              .body(reqBody)
              .execute().body();
      return JSONObject.parseObject(result);
  }

要注意的是,这里用的 JSONObject 是来自fastjson,之前用 hutool 带的处理,会有报错,搞了好一会。

三、前端实现

我这里是整个功能开发完成后进行整理的,实际上,后端接口逻辑不是一次性写完的。先写好一个可以前端调得通的接口,然后一点点前后调试完成。

前端这里做的事情不多,在【发送】按钮上绑定一个点击实践,调用后端开发好的接口。

方法apiTestRun内部,主要是处理请求入参,调用请求,处理返回即可:

红框里是调用接口的部分,前面的是处理入参。这里的 3 个判断是看目前点击了哪个 tab,然后传对应入参类型给接口。

接下来测试下功能OK。

四、修改遗留 bug

在测试功能的时候,发现了几个问题。大概表现都是因为前端参数赋值,或者没重置干净导致的。

增加和修改了一些代码,完整代码更新

前端:

https://github.com/wessonlan/bloomtest-web

后端

https://github.com/wessonlan/bloomtest-backend

以上就是springboot+vue测试平台接口定义及发送请求功能实现的详细内容,更多关于springboot+vue接口定义发送请求的资料请关注我们其它相关文章!

(0)

相关推荐

  • springboot vue测试平台接口定义及发送请求功能实现

    目录 基于 springboot+vue 的测试平台开发 一.http客户端选型 二.后端接口实现 1. controller 层 2. service 层 三.前端实现 四.修改遗留 bug 基于 springboot+vue 的测试平台开发 继续更新 添加的接口,我要来调试确定是否是通的,那么要发送接口请求,今天来实现这个功能,先预览一下: 捋一下思路,分为三步走: 点击发送按钮,调用后端接口后端接口处理内部,发送http接口请求后端接口把响应返回给前端展示 一.http客户端选型 为了更方

  • springboot vue测试平台接口定义前后端新增功能实现

    目录 开发继续更新 一.后端部分 二.前端部分 1. rest参数 2. 请求体 3. 请求参数 4. 请求接口 基于 springboot+vue 的测试平台 开发继续更新 上节画了大概的前端页面,今天主要来实现后端接口,然后调通前后端实现接口新增功能.先预览下效果: 老规矩,分为前后端讲解. 一.后端部分 在 ApiDefinitionController 类中新增一个处理方法,处理接口的新增请求: @PostMapping("/add") public Result add(@R

  • springboot vue测试平台前端项目查询新增功能

    目录 基于 springboot+vue 的测试平台开发 一.查询功能 1. input 输入框 2. 查询按钮 二.新增功能 1. 新增按钮 2. 对话框 3. 新增数据 基于 springboot+vue 的测试平台开发 继续更新. 一.查询功能 在之前的项目列表接口里,支持使用项目名称模糊查询,现在来实现前端. 1. input 输入框 到组件库里找个输入框: 复制代码,修改代码: v-model: 绑定了下面 data 中的projectQuery.projectName. style=

  • springboot vue测试平台开发调通前后端环境实现登录

    目录 基于 springboot+vue的测试平台开发 一.前端环境搭建 快速安装 二.后端环境搭建 创建应用 配置 application.properties 三.实现登录 1. mysql 建表 2. 后端-实现 /login 接口 3. 前端-修改代码实现登录 4. 解决跨域 5. 后端-实现 /useInfo 接口 6. 后端-实现 /logout 接口 四.小结 基于 springboot+vue的测试平台开发 一.前端环境搭建 在前端框架vue-element-admin这个项目中

  • springboot vue测试列表递归查询子节点下的接口功能实现

    目录 基于 springboot+vue 的测试平台开发 一.后端 1. 建表 2. 列表接口 二.前端 1. 准备工作 2. 请求接口 3. 测试效果 4. 发现问题 基于 springboot+vue 的测试平台开发 继续更新 模块树节点的开发暂告一段落,现在开发右边接口相关的部分,今天先完成列表的功能. 功能是这样,当点击树的某个节点时候,右侧列表展示这个节点下的所有接口,带分页(最终效果图). 需要注意的是,因为节点下还有子节点,所以列表的功能需要使用递归来查询. 一.后端 1. 建表

  • springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)

    1. 什么是支付宝接口(沙箱环境)? 记录时间:2020年10月15日3:55 现如今,手机支付已相当普遍,而作为开发人员应该对手机支付操作有所了解.而支付宝接口是支付宝提供的一个接口,用来对接软件应用程序在进行金钱交易使用.然后对于编程爱好者而言,想学习这一点就有点难,因为要想使用支付宝接口,必须前提是使用软件应用程序,软件应用程序需要向支付宝申请,提交一系列资料,这一点是实现不了的.这就对开发者增加了一定的难度,因为产品没有上线,然后需要对接支付宝接口就是很大的问题,所以出现了沙箱环境,具有

  • springboot vue测试前端项目管理列表分页功能实现

    目录 基于 springboot+vue 的测试平台开发 一.前后端调通 1. 请求后端接口 2. 项目列表页面 3. 调整接口返回的时间格式问题 二.实现列表数据显示 1. 使用element UI组件库 2. 修改复制来的代码 三.实现分页 1.使用 组件 2. 给分页相关字段赋值 3. 关于 .sync 修饰符 基于 springboot+vue 的测试平台开发 继续更新 今天来完成项目列表的前端部分. 一.前后端调通 开发前端页面,框架里有 2 个地方需要改动: src/views: 这

  • springboot vue接口测试前后端树节点编辑删除功能

    目录 基于springboot+vue 的测试平台开发 一.编辑功能 1. 编辑页外显 2. 实现后端接口 3. 前后联调 4. 测试 二.删除功能 1. 后端接口 2. 前端实现 3. 测试 基于springboot+vue 的测试平台开发 继续更新. 一.编辑功能 1. 编辑页外显 点击树节点的编辑按钮,打开对话框,展示原有的节点名称. 本来树形控件里没有自带的编辑操作,我直接加了一个按钮在上面,绑定点击事件调用edit(data)方法. 为了确认 data 可用,我在edit方法中打印了一

  • springboot vue接口测试前后端实现模块树列表功能

    目录 基于 springboot+vue 的测试平台 一.存放接口的js文件 二.在vue文件中调用接口 1. 触发接口 2. 调用接口 三.实现选择项目功能 1. 后端增加获取所有项目接口 2. 前端调用接口 3. 选择项目触发模块树接口 4. 测试一下 基于 springboot+vue 的测试平台 开发继续更新. 上一篇完成了模块树的列表接口,接下来可以和前端页面联调了. 一.存放接口的js文件 老样子,新建js文件,把要调用的后端接口请求封装在 src/api/apiModule.js这

  • vue中element 的upload组件发送请求给后端操作

    1.用到了before-upload属性, 用于在上传文件前的校验,并且发送请求给后端,传输格式进行文件流传输 什么都不用设置,action属性随便设置,不能为空即可! 在before-upload属性的方法中的代码如下: var _this = this; debugger; // var files=file.target.files[0]; debugger; const isJPG = file.type === "image/jpeg"; const isLt2M = fil

随机推荐