Vue中的request请求

本文详细描述了如何在前端Vue应用中使用axios进行GET和POST请求,以及后端Django的相应处理。通过VITE_BASE_URL实现灵活的接口基础地址配置。展示了如何在`plot1`和`inferenceBN`两个场景中进行数据请求和交互。

接口也成为数据接口,用来接收数据。

GET请求方式

前端部分:

  • src/utils/request.ts
//    src/utils/request.ts

import axios from 'axios'

const request = axios.create({
    baseURL:'http://127.0.0.1:8000',  //直接指定
    baseURL:import.meta.env.VITE_BASE_URL  //间接动态指定
})
  •  src/api/analysis/plot1.ts
//写一个函数,返回request请求实例

import request from "@/utils/system/request";

export function py2mat_plot1() {
    return request({
        url: '/py2mat1',
        method: 'GET',
    })
}

//实际请求的是baseURL + url
  • src/views/analysis/py2mat1/index.vue
    //可以调用函数返回的请求实例,获取结果数据
    
    <template>
    
      {{pyPosterior}}
    
    </template>
    
    <script lang="ts">
        import * as echarts from "echarts"
        import {onMounted, ref} from "vue"
        import { py2mat_plot1 } from "@/api/py2mat/plot1"
    
        export default {
            name: "index",
            setup () {
              const pyPosterior = ref()
              py2mat_plot1().then((res)=>{
                pyPosterior.value = res.data
              })
            
              return{
                // drawModOutputChart
                pyPosterior
              }
    
            },
        }
    </script>
    
    <style scoped>
        .wrap-row {
            display: flex;
            flex-flow: row wrap;
            height: 100%;
        }
    </style>
    

    为了让baseURL变得灵活一些,将原来的baseURL:"xxx"改为baseURL:import.meta.env.VITE_BASE_URL,可以通过更改.env文件修改baseURL,import.meta.env.VITE_BASE_URL是在.env中指定,可以继续使用代理在vite.config.ts指定具体端口

后端部分:

bnet-backend/py2mat1/views.py

通过端口配置和Django框架urls.py设置确定views.py2mat_plot1的url,与前端请求的url一致,实现数据交互。

//定义函数,返回值作为数据传递

from rest_framework.decorators import api_view
from django.shortcuts import render
from utils.web.http_utils import BaseResponse
# Create your views here.


@api_view(['GET'])
def py2mat_plot1(request):
    data=1
    return BaseResponse(data=data)

POST请求方式

前端Vue部分

  • src/utils/request.ts
//    src/utils/request.ts

import axios from 'axios'

const request = axios.create({
    baseURL:'http://127.0.0.1:8000',  //直接指定
    baseURL:import.meta.env.VITE_BASE_URL  //间接动态指定
})
  • src/api/analysis/inference.ts
export function inferenceBN(data: object) {
  return request({
    url: '/inference/inferenceBN',
    method: 'POST',
    data
  })
}
  • src/views/main/analysis/inference/components/result.vue
    const run = () => {
      let requestBody = {
        learnerParams: {
          algorithm:algorithm.value,
          target: target.value,
          jointTarget: jointTarget.value,
          evidence: evidence.value,
          config: config.value
        },
        dataParams: {
          model:model.value,
        },
      }
      inferenceBN(requestBody).then((res) => {
        if(res) {
          resultList.value = res.data.targets
          if(res.data.jointTarget !== '') {
            res.data.jointTarget.forEach((item: object) => {
              resultList.value.push(item)
            })
          }
        }
      })
    }
    return {
      resultList,
      run
    }

后端Django部分

  • inference/views.py
@api_view(['POST'])
def inference(request):
    req = post_request_dict(request)
    try:
        resp = _inference(req['learnerParams'], req['dataParams'])
    except Exception as e:
        return BaseResponse(code=CODE_SERVER_ERROR, message=str(e))
    return BaseResponse(data=resp)

Vue.js 中使用 `$request` 进行网络请求,通常是通过封装一个基于 `axios` 或原生 `uni.request` 的插件或工具类,并将其挂载到 Vue 的原型上(如 `Vue.prototype.$request`),从而使得所有 Vue 组件都可以通过 `this.$request` 调用网络方法。 ### 基本使用方式 #### 1. 安装并引入插件 如果使用的是第三方库如 `vue-request`,可以通过如下方式安装并初始化: ```javascript import Vue from 'vue'; import VueRequest from 'vue-request'; Vue.use(VueRequest); ``` 之后即可在组件中直接调用: ```javascript this.$request.get('https://api.example.com/data') .then(response => { console.log(response.data); }) .catch(error => { console.error('There was an error!', error); }); ``` #### 2. 自定义封装请求 若希望对请求进行统一管理(如添加拦截器、错误处理等),通常会创建一个 `request.js` 文件进行封装: ```javascript // request.js import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // API 的 base_url timeout: 5000, // 请求超时时间 }); // 请求拦截器 service.interceptors.request.use(config => { // 可在此处添加 token 等认证信息 return config; }, error => { console.error('Request Error:', error); return Promise.reject(error); }); // 响应拦截器 service.interceptors.response.use(response => { const res = response.data; if (res.code !== 200) { console.error('API Error:', res.message); return Promise.reject(new Error(res.message || 'Error')); } else { return res; } }, error => { console.error('Response Error:', error); return Promise.reject(error); }); export default service; ``` 然后在 `main.js` 中将其挂载为 Vue 的原型属性: ```javascript import Vue from 'vue' import App from './App' import request from './common/js/request.js' Vue.config.productionTip = false Vue.prototype.$request = request new Vue({ render: h => h(App) }).$mount('#app') ``` 这样在组件中就可以像下面这样使用: ```javascript mounted() { this.$request.get('/user/list') .then(data => { console.log('用户列表:', data); }) .catch(err => { console.error('请求失败:', err); }); } ``` #### 3. 在 UniApp 中使用 $request 对于 UniApp 项目,可以采用类似的方式封装 `uni.request` 并挂载到 Vue 原型上: ```javascript // request.js const baseUrl = "http://localhost:6645"; export default { get(url, data) { return uni.request({ url: baseUrl + url, method: 'GET', data: data }); }, post(url, data) { return uni.request({ url: baseUrl + url, method: 'POST', data: data, header: { 'content-type': 'application/x-www-form-urlencoded' } }); } } ``` 同样地,在 `main.js` 中挂载: ```javascript import Vue from 'vue' import App from './App' import request from './common/js/request.js' Vue.config.productionTip = false Vue.prototype.$request = request const app = new Vue({ ...App }) app.$mount() ``` 组件中使用示例: ```javascript methods: { getBanner() { this.$request.get(this.$api.home.banner, { type: 2 }).then(response => { console.log('请求到的数据', response.data); }); } } ``` #### 4. 封装上传文件的方法 如果你需要上传文件,也可以在封装中添加相关逻辑: ```javascript uploadFile(file) { let params = new FormData(); params.append('file', file); params.append('ucenter_id', this.$store.getUserId()); this.$request.post('/upload/image', params).then(res => { console.log(res); }); } ``` --- ### 总结 - `$request` 是一种常见的 Vue 插件式网络请求封装方式。 - 可以基于 `axios` 或 `uni.request` 实现更灵活的封装。 - 挂载到 `Vue.prototype` 后,可在任意组件中使用 `this.$request` 发起请求。 - 支持 GET、POST 等多种请求方式,并可统一处理拦截器、错误提示等[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值