vue3版本+TS(typescript)+简单封装api 配置反向代理

本文展示了如何在Vue3项目中结合TypeScript和axios来封装API请求,包括创建axios实例、设置基础URL、添加请求和响应拦截器,以及处理不同错误代码。此外,还介绍了如何使用ElementPlus进行错误提示,并提供了在组件中调用API获取数据的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue3版本+TS(typescript)+封装api

1、在src下新建一个 shared文件夹 文件夹下新建一个request.ts文件,在此文件里写如如下代码

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";
import { ElMessage } from 'element-plus'

interface requestType {
  url: string
  params?: any
}
const handleCode = async (code: number, msg: string) => {
  switch (code) {
    case 401:
      ElMessage.error(msg || '登录失效')
      setTimeout(() => {
        console.log('登录失效')
      }, 1500)
      // 跳转登录
      break
    default:
      ElMessage.error(msg || `后端接口${code}异常`)
      break
  }
}



//创建axsio 赋给常量service
const service: AxiosInstance = axios.create({
  baseURL:process.env.VUE_APP_BASE_URL,
   timeout:30000,
   headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  }
});
// 添加请求拦截器
service.interceptors.request.use(
   (config: any)=> {
    console.log(config,'config')
    return config;
  },
   (error:any)=> {
    // 对请求错误做些什么
    console.log(error,'error')
    return Promise.reject(error);
  }
);
// 添加响应拦截器
service.interceptors.response.use(
   (response: AxiosResponse)=> {
    //response参数是响应对象
    // 对响应数据做点什么
    const { data, config } = response
    return data;
  },
   (error:any)=> {
    const { response} = error
   
    if (error.response && error.response.data) {
      const { status, data } = response
      handleCode(status, data.msg)
     
    // 对响应错误做点什么
    return Promise.reject(error);
    }else {
      let { message } = error
      if (message === 'Network Error') {
        message = '后端接口连接异常'
      }
      if (message.includes('timeout')) {
        message = '后端接口请求超时'
      }
      if (message.includes('Request failed with status code')) {
        const code = message.substr(message.length - 3)
        message = '后端接口' + code + '异常'
      }
      message.error(message || `后端接口未知异常`)
      return Promise.reject(error);
    }
  }
);





/**
 * @description GET
 */
 const GET = (data: requestType) => {
  return service.get(data.url, data.params)
}

/**
 * @description POST
 */
 const POST = (data: requestType) => {
  return service.post(data.url, data.params)
}
/**
 * @description PUT
 */
 const PUT = (data: requestType) => {
  return service.put(data.url, data.params)
}

/**
 * @description DELETE
 */
const DELETE = (data: requestType) => {
  return service({
    url: data.url,
    method: 'delete',
    data: data.params,
  } as AxiosRequestConfig)
}

/**
 * @description PATCH
 */
const PATCH = (data: requestType) => {

  return new Promise((resolve, reject) => {
    service
      .put(data.url, data.params)
      .then((res: any) => {
        if (res && res.status == 200) {
          resolve(res)
        }
      })
      .catch((error: any) => {
        reject(error)
      })
  })
}
export { GET, POST, PUT, DELETE, PATCH }

2 在src下新建一个api文件夹 在api文件夹下新建一个ts文件 ts文件代码如下

//XXXX
import { GET, POST, PUT, DELETE } from '@/shared/request'
let URL = '/drone/drones/'
export function getDrone(params: any) {
  return GET({ url: URL, params: params })
}

3、在页面中写代码发请求

<template>
  <div class="home">
    5465465
    <el-table :data="tableData" stripe style="width: 100%">
      <el-table-column prop="name" label="无人机名称" />
      <el-table-column prop="contact_phone" label="联系人" />
      <el-table-column prop="max_height" label="联系电话" />
      <el-table-column prop="max_speed" label="最大飞行高度" />
      <el-table-column prop="life_time" label="续航时间" />
      <el-table-column prop="is_running" label="运行状态" />
    </el-table>
  </div>
</template>

<script lang="ts" setup>
import { reactive, ref, createVNode, onMounted } from "vue";
import { ElMessage } from 'element-plus'
import { getDrone } from "@/api/base";//<*************************
const tableData = ref<any>([]);

async function getDroneData() {//<*************************
  let param = {
    page_index: 1,
    page_size: 20,
  };
  let res: any = await getDrone(param);
  if (res.code === 20000) {
      let arr = res?.data.list
      tableData.value = arr
    } else {
      ElMessage.error(res.msg)
    }
}
onMounted(() => {
  getDroneData();
});
</script>

4、新建.env.development 与.env.production
在这里插入图片描述
5、配置反向代理

const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
  publicPath: "./",
  outputDir: "dist", //打包文件名称
  transpileDependencies: true,
  devServer: {
    // port: 8080,
    proxy: {
      "/api": {
        target: "https://dev.XXXXXXXXXXXXX", //反向代理地址
        changeOrigin: true,
        pathRewrite: {
          "^/api": "",
        },
      },
    },
  },
  chainWebpack: (config) => {
    config.plugin("html").tap((args) => {
      args[0].title = "XXXX";//系统标题
      return args;
    });
  },
});

### Vue3配置和使用正向代理与反向代理 #### 配置环境概述 对于基于不同构建工具的Vue3项目,如Vue CLI 和 Vite,在开发环境中配置正向代理或反向代理的方法有所不同。 #### 使用 Vue CLI 进行反向代理配置 在 `vue.config.js` 文件中可以通过设置 `devServer.proxy` 来实现反向代理功能。这允许前端请求被转发到指定的服务端地址上处理[^2]: ```javascript module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://localhost:4000&#39;, ws: true, changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; } }, } } }; ``` 此段代码展示了如何将 `/api` 开头的所有请求重定向至本地运行于4000端口上的服务,并移除路径前缀 `/api` 后再发送给目标服务器。 #### 使用 Vite 实现正向代理配置 针对采用Vite作为打包工具的新建Vue3应用,则可以在 `vite.config.ts` 或者 `vite.config.js` 中通过定义 `server.proxy` 属性完成相同目的的操作[^4]: ```typescript import { defineConfig } from &#39;vite&#39; export default defineConfig({ server: { proxy: { &#39;/targetApi&#39;: { target: &#39;https://example.com/&#39;, changeOrigin: true, rewrite: (path) => path.replace(/^\/targetApi/, &#39;&#39;) } } } }) ``` 这里指定了一个新的API路由 `/targetApi` ,它会把所有匹配该模式下的HTTP调用转交给外部站点 https://example.com 处理;同时启用了跨域资源共享(CORS),并去除了原始URL中的特定部分以便更好地适配后端接口结构。 #### Axios 库集成与请求拦截器设定 为了简化 HTTP 请求操作以及统一管理 API 调用逻辑,通常还会结合第三方库 axios 完成更高级别的封装工作。比如创建全局实例时可预先配置好基础 URL、默认参数等信息,从而减少重复编码量的同时也提高了项目的灵活性和维护性[^1]: ```javascript // src/utils/request.js import axios from "axios"; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 根据实际部署情况调整此处变量值 }); service.interceptors.request.use( config => { const token = localStorage.getItem(&#39;token&#39;); if(token){ config.headers[&#39;Authorization&#39;] = `Bearer ${token}`; } return config; }, error => Promise.reject(error)); export default service; ``` 上述片段说明了怎样利用 axios 创建自定义客户端对象,并为其附加了一个预处理器用于自动注入认证令牌(如果存在的话),确保每次发起网络通信之前都能携带必要的身份验证凭证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值