vue3实现类postman 接口测试功能

效果:

功能描述:

主要实现form-data、x-www-form-urlencoded、raw以及单独上传文件功能、可单独配置请求头

获取测试结果并下载为json格式文件

raw代码编辑器:选择monaco

html

<template>
  <el-dialog v-model="testvisible" :appendToBody="true" title="测试配置" class="testdialog" width="70%">
    <div class="test-main">
      <el-row :span="24">
        <el-col :span="16">
          <div class="test-row">
            <div class="test-item">
              <p class="">请求方式</p>
              <el-select v-model="method" placeholder="请选择">
                <el-option v-for="item in methodList" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </div>
            <!-- <div class="test-item">
              <p class="">接口协议</p>
              <el-radio v-model="testhttp" label="0">https</el-radio>
              <el-radio v-model="testhttp" label="1">http</el-radio>
            </div> -->
          </div>
          <div class="test-row">
            <div class="test-item">
              <p>接口路径 :</p>
              <el-input v-model="data.url"></el-input>
            </div>
            <div class="test-item">
              <p>测试数据类型 :</p>
              <el-radio v-model="datatype" label="0">Body</el-radio>
              <el-radio v-model="datatype" label="1">文件</el-radio>
            </div>
          </div>
          <div class="test-row">
            <p>请求头(Headers):</p>
            <el-form>
              <template v-for="(item, index) in itemList" :key="index">
                <el-form-item>
                  <span class="test-item1">
                    <p>Key</p>
                    <el-input v-model="item.key" :disabled="item.edit"></el-input>
                  </span>
                  <span class="test-item1">
                    <p>Value</p>
                    <el-input v-model="item.value" :disabled="item.edit"></el-input>
                  </span>
                  <el-button type="text" @click="delitemList(index)">删除</el-button></el-form-item
                >
              </template>
            </el-form>
          </div>
          <el-button type="text" @click="additemList"
            ><el-icon class="el-icon--upload"><Plus /></el-icon>添加参数</el-button
          >
          <div class="test-row">
            <div class="test-item">
              <p>服务地址预览 :</p>
              <div>{{ data.url }}</div>
            </div>
          </div>
          <div class="test-row">
            <div style="width: 100%">
              <p>测试输入(Body)</p>
              <!-- <el-upload
                multiple
                v-if="datatype === '1'"
                ref="uploadref"
                :httpRequest="handleUpload"
                :onRemove="handleRemove"
                :onChange="handleChange"
                :onSuccess="handleSuccee"
                :beforeUpload="beforeUpload"
                :fileList="fileList"
              >
                <el-button
                  ><el-icon class="el-icon--upload"><Upload /></el-icon>点击上传</el-button
                >
                <div class="el-upload__tip">不超过500m</div>
              </el-upload> -->
              <el-upload
                v-if="datatype === '1'"
                ref="uploadref"
                multiple
                :headers="{ 'Fawkes-Auth': accessToken }"
                action="/api/sys-storage/upload"
                :onRemove="handleRemove"
                :onChange="handleChange"
                :onSuccess="handleSuccee"
                :beforeUpload="beforeUpload"
                :fileList="fileList"
              >
                <el-button
                  ><el-icon class="el-icon--upload"><Upload /></el-icon>点击上传</el-button
                >
                <div class="el-upload__tip">不超过500m</div>
              </el-upload>
              <div v-if="datatype === '0'">
                <el-radio-group v-model="bodyType">
                  <el-radio :label="0">form-data</el-radio>
                  <el-radio :label="1">x-www-form-urlencoded</el-radio>
                  <el-radio :label="2">raw</el-radio>
                </el-radio-group>
                <template v-if="bodyType !== 2">
                  <el-form>
                    <template v-for="(item, index) in bodyformList" :key="index">
                      <el-form-item>
                        <span class="test-item1">
                          <p>Key</p>
                          <el-input v-model="item.key">
                            <template v-if="bodyType === 0" #append>
                              <el-select
                                v-model="bodyformList[index].seletValue"
                                placeholder=""
                                style="width: 115px"
                                @change="selectChange(bodyformList[index].seletValue)"
                              >
                                <el-option
                                  v-for="(el, index) in optionsList"
                                  :key="index"
                                  :label="el"
                                  :value="index"
                                ></el-option>
                                <!-- <el-option label="文本" value="1" />
                                <el-option label="文件" value="2" /> -->
                              </el-select>
                            </template>
                          </el-input>
                        </span>
                        <span class="test-item1">
                          <p>Value</p>
                          <el-upload
                            v-if="bodyformList[index].seletValue === 1 && bodyType === 0"
                            ref="uploadref"
                            multiple
                            :headers="{ 'Fawkes-Auth': accessToken }"
                            action="/api/sys-storage/upload"
                            :onRemove="handleRemove"
                            :onChange="handleChange"
                            :onSuccess="
                              (response, file, file_list) => {
                                return msgPaySuccess(response, file, file_list, index)
                              }
                            "
                            :beforeUpload="beforeUpload"
                            :fileList="fileList"
                          >
                            <el-button
                              ><el-icon class="el-icon--upload"><Upload /></el-icon>点击上传</el-button
                            >
                            <!-- <div class="el-upload__tip">不超过500m</div> -->
                          </el-upload>
                          <el-input v-else v-model="item.value"></el-input>
                        </span>
                        <el-button type="text" @click="delbodyList(index)">删除</el-button></el-form-item
                      >
                    </template>
                  </el-form>
                  <el-button type="text" @click="addbodyList"
                    ><el-icon class="el-icon--upload"><Plus /></el-icon>添加参数</el-button
                  ></template
                >
                <JsonEditor
                  v-if="bodyType === 2"
                  ref="monacoEdit"
                  v-model:modelValue="rawdata"
                  :readonly="false"
                  main="json"
                  type="json"
                  :height="300"
                />
              </div>
            </div>
          </div>
          <div>
            <el-button type="primary" @click="testclick">执行</el-button>
            <!-- <el-button type="primary" @click="testclick">停止</el-button>
            <el-button type="primary" @click="testclick">重置</el-button> -->
          </div>
        </el-col>
        <el-col :span="8">
          <div>
            <div style="float: left">返回结果</div>
            <el-button v-if="resultData" style="float: right" type="text" @click="downData">下载</el-button>
          </div>
          <div style="margin-top: 30px">
            {{ resultData }}
          </div>
          <div style="position: absolute; bottom: 20px">
            <span v-if="responseStatus" class="succeessText">状态码:{{ responseStatus }}</span>
            <span v-if="responseTime" class="succeessText">响应时间:{{ responseTime }} ms</span>
            <span v-if="responseSize" class="succeessText">响应大小:{{ responseSize }} B</span>
          </div>
        </el-col>
      </el-row>
    </div>
  </el-dialog>
</template>

主要测试代码

function testclick() {
  if (!props.data.url) {
    FksMessage.error('请配置接口路径')
    return
  }
  const obj = {}
  const code = 'ACCESSCODE'
  obj['Authorization'] = `${code} ${props.data.accessCode}`
  itemList.value.forEach((el) => {
    if (el.key) {
      obj[el.key] = el.value
    } else {
      delete obj[el.key]
    }
  })
  let dataparams
  // body
  if (datatype.value === '0') {
    // form-data
    if (bodyType.value === 0) {
      let formdata = new FormData()
      bodyformList.value.forEach((el) => {
        formdata.append(el.key, el.value)
      })
      dataparams = formdata
      obj['Content-Type'] = 'multipart/form-data; boundary=<calculated when request is sent>'
    }
    // x-www
    if (bodyType.value === 1) {
      const params = new URLSearchParams()
      bodyformList.value.forEach((el) => {
        params.append(el.key, el.value)
      })
      dataparams = params
      obj['Content-Type'] = 'application/x-www-form-urlencoded'
    }
    // raw
    if (bodyType.value === 2) {
      dataparams = rawdata.value
      obj['Content-Type'] = 'application/json'
    }
  }
  // binary
  if (datatype.value === '1') {
    // const formData = new FormData()
    // formData.append('file', fileList.value.file)
    dataparams = fileData.value
    obj['Content-Type'] = 'application/octet-stream'
  }

  const dataMethod = methodList.value.find((el) => {
    return el.value === method.value
  })

  const options = {
    method: dataMethod.label,
    headers: obj,
    data: dataparams
  }
  const url = props.data.url
  const startTime = performance.now()

  axios(url, options)
    .then((res) => {
      const endTime = performance.now()
      responseTime.value = Math.round(endTime - startTime)
      responseStatus.value = res.status
      resultData.value = res.data
      if (res.headers['content-length']) {
        responseSize.value = parseInt(res.headers['content-length'], 10)
      } else {
        // 如果服务器没有返回Content-Length,则无法直接获取响应大小
        responseSize.value = '未知'
      }
    })
    .catch((err) => {
      console.log(err)
      if (err.response) {
        responseStatus.value = err.response.status
      }
      resultData.value = err
    })
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
FasterRunner - [X] 支持同步YAPI(Swagger,Postman),无需手动录入接口 - [X] 继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求 - [X] 借助驱动代码(debugtalk.py),在测试脚本中轻松实现请求参数签名,加密和解密响应等 - [X] 支持完善的 hook 机制,通过请求前置和后置函数,完美解决单接口的token依赖和多个接口的参数传递 - [X] 类crontab的定时任务, 无需额外学习成本 - [X] 测试用例支持参数化和数据驱动机制 - [X] Gitlab-CI, Jenkins 等持续集成工具完美结合 - [X] 测试结果统计报告简洁清晰,附带详尽统计信息和日志记录 - [X] 测试报告推送飞书,钉钉,企业微信等 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
### 回答1: 使用SpringBoot和Vue实现上传视频和播放视频功能可以通过以下步骤进行操作。 1. 后端实现: 使用SpringBoot创建一个后端项目,配置相关依赖和数据库连接等。在后端项目中,可以使用第三方库或自定义接口来处理视频上传功能。可以使用Spring MVC的`MultipartFile`来接收视频文件,并将视频保存到服务器的指定目录中。同时,可以在数据库中存储视频的相关信息,如文件名、路径等。 此外,可以创建一个接口供前端调用来获取上传后的视频列表信息。该接口可以从数据库中读取视频信息,并返回给前端。 2. 前端实现: 使用Vue创建一个前端项目,配置相关依赖,并创建一个视频上传组件。在该组件中,可以使用`<input type="file">`标签来选择视频文件,并通过Vue的事件监听来获取用户选择的视频文件。 在上传视频的方法中,可以使用`axios`或其他库来发送视频文件到后端的上传接口。上传完成后,可以根据后端返回的信息进行提示或其他处理。 另外,可以创建一个视频播放组件,用于展示上传成功的视频列表。在该组件中,可以通过调用后端提供的获取视频列表的接口,获取视频的相关信息。然后,可以使用HTML5的`<video>`标签来播放视频,并根据需要进行进一步的自定义样式和功能开发。 3. 测试和部署: 完成上传视频和播放视频功能后,可以进行测试。使用Postman或其他方式测试后端的上传接口,确保视频可以正确上传并存储到服务器中。同时,也可以在前端页面中测试视频上传和播放功能,确认功能完整且正常工作。 最后,可以将后端项目打包成可执行的jar包,并部署到服务器上。将前端项目打包成静态文件,并放置到服务器的可访问位置。通过配置服务器的端口和域名等信息,使上传视频和播放视频的功能可以通过访问服务器的URL地址来使用。 ### 回答2: 要实现上传视频和播放视频功能,可以使用Spring Boot和Vue.js来完成。 首先,在Spring Boot中,可以使用Spring MVC框架来处理上传视频的请求。可以通过编写一个控制器类来处理上传视频的逻辑,使用`@RequestMapping`注解来映射上传视频的接口。在该接口中,可以使用`MultipartFile`类型的参数来接收上传的视频文件,并使用`transferTo()`方法将视频保存到指定的位置。 接下来,可以使用Vue.js来构建前端界面。可以使用`vue-router`来实现路由功能,创建多个组件来处理上传视频和播放视频的逻辑。在上传视频的组件中,可以使用`el-upload`组件来实现视频文件的选择和上传,通过请求Spring Boot的上传视频接口将视频文件传递给后端。在播放视频的组件中,可以使用`video`标签来实现视频播放功能,并将视频的URL设置为动态值。 在后端处理上传视频请求后,可以返回一个视频的URL给前端,用于在播放视频的组件中进行展示。可以将视频URL保存在数据库中,并在前端从数据库中获取视频URL进行展示。 总结起来,使用Spring Boot处理上传视频的请求,将视频文件保存到指定位置,同时将视频URL保存到数据库中。使用Vue.js构建前端界面,使用`el-upload`组件实现视频的选择和上传,使用`video`标签实现视频的播放功能,并从数据库中获取视频URL进行展示。通过这样的方式,就可以实现上传视频和播放视频的功能。 ### 回答3: 要实现上传视频和播放视频的功能,可以使用Spring Boot和Vue这两种技术。 在后端,可以使用Spring Boot来搭建一个RESTful API服务。首先,需要定义一个接口用于处理视频上传的请求。可以使用Spring的MultipartFile类来接收视频文件,并将其存储在服务器的指定位置。可以使用Java的IO流来实现文件的读写,确保视频文件保存在服务器上。 在前端,可以使用Vue来构建用户界面。首先,需要创建一个上传视频的表单,以便用户选择要上传的视频文件。使用Vue的formData对象来将视频文件转换为二进制数据,并通过POST请求将其发送给后端接口。同时,还可以使用Vue的进度条组件来显示视频上传的进度。 在后端,接收到视频文件后,可以将其保存在指定路径下,并将文件路径存储在数据库中。这样,可以在后续的播放视频功能中使用该路径来访问视频文件。可以使用Spring Boot提供的静态资源处理功能来访问保存在服务器上的视频文件。 在前端,可以使用Vue的视频播放器组件来实现视频播放功能。可以通过后端返回的视频文件路径来加载视频,并在页面上展示视频播放器。可以使用Vue的事件处理机制,例如点击事件,来控制视频的播放、暂停、快进、后退等操作。 综上所述,通过结合Spring Boot和Vue,可以实现上传视频和播放视频的功能。通过后端的接口和前端的用户界面,用户可以方便地上传和播放视频。同时,还可以根据具体需求,进一步扩展视频管理功能,例如视频列表展示、视频分类等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值