vue3+TypeScript+axios封装一个网络请求函数,拿了就能用

一、前言:

做业务的时候我估计大家请求网络的方法调了无数次了,但很少自己去封装一个,刚好最近有个vue3+TypeScript的新坑我负责去搭框架,封装axios请求的时候发现和JS还是有点区别的,所以记录一下。

二、认识axios中的AxiosRequestConfig和AxiosResponse

封装过程中用到了这两个类型,在用vue3项目的小伙伴不知道有没有看到过这行代码。如果看到过你知道AxiosRequestConfig和 AxiosResponse是啥意思不?

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

在axios中,AxiosRequestConfig 和AxiosResponse 都是一种axios库自带的类型可以直接用也可以自己重写:

AxiosRequestConfig:
用于配置HTTP请求的相关参数。它包含了一系列可配置的选项,用于定制化请求的行为。以下是一些常见的AxiosRequestConfig
选项:

  • url : 发送请求的URL地址。
  • method : 请求使用的HTTP方法(例如GET、POST、PUT、DELETE等)。
  • params : 一个包含键值对的对象,用于作为GET请求的查询参数。
  • data : 要作为POST或PUT请求体发送的数据。
  • headers : 一个包含自定义请求头的对象。
  • timeout : 请求超时时间,单位为毫秒。
  • responseType : 期望在响应中接收的数据类型(例如’json’、‘text’、'blob’等)。

AxiosResponse :
用于表示HTTP请求的响应数据。它包含了请求的响应信息,如状态码、响应头、响应数据等。以下是一些AxiosResponse
接口中常见的属性:

  • data : 响应数据,通常是一个包含服务器响应的数据的对象。
  • status : HTTP状态码,表示请求的结果。
  • statusText : HTTP状态消息,与状态码对应的文本描述。
  • headers : 响应头信息,包含服务器返回的所有响应头。
  • config : 包含发起请求时提供的配置信息的对象。
  • request : 包含关于请求的详细信息的对象。

三、封装完整请求函数和用法说明

(1)封装函数,文件命名为request.ts

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import useStore from '@/store';

// 创建一个 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 50000,
  headers: { 'Content-Type': 'application/json;charset=utf-8' }
});

// 请求拦截器
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    if (!config.headers) {
      throw new Error(
        `好像没有请求头哦`
      );
    }
    // 这里是从vuex或者pinia中拿到token, 并且放到请求头中
    const { user } = useStore();
    if (user.token) {
      config.headers.Authorization = `${window.localStorage.getItem('token')}`;
    }
    return config;
  },
  (error: any) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const { code, msg } = response.data;
    if (code === '00000') {
      return response.data;
    } else {
      // 响应数据为二进制流处理(Excel导出)
      if (response.data instanceof ArrayBuffer) {
        return response;
      }

      ElMessage({
        message: msg || '系统出错',
        type: 'error'
      });
      return Promise.reject(new Error(msg || 'Error'));
    }
  },
  (error: any) => {
    if (error.response.data) {
      const { code, msg } = error.response.data;
      // token 过期,重新登录
      if (code === 'A0999') {
        ElMessageBox.confirm('当前页面已失效,请重新登录', 'Warning', {
          confirmButtonText: 'OK',
          type: 'warning'
        }).then(() => {
          window.localStorage.clear();
          window.location.href = '/';
        });
      } else {
        ElMessage({
          message: msg || '系统出错',
          type: 'error'
        });
      }
    }
    return Promise.reject(error.message);
  }
);

// 导出 axios 实例
export default service;

(2)需要请求某个接口时

写在api.ts文件中

import request from '@/utils/request';

/**
 * 使用添加用户信息接口
 * @param data
 */
export function addUser(data: any) {
  return request({
    url: '/api/index/users',
    method: 'post',
    data: data
  });
}

(3)在业务页面使用addUser接口

import { addUser } from '@/api/user';

/**
 * 提交接口
 */
function saveForm() {
  formRef.value.validate((valid: any) => {
    if (valid) {
        addUser(state.formData).then(() => {
          ElMessage.success('提交成功咯');
        });
      }
  });
}

小结:

从封装到使用的流程都写出来了,应该挺好理解的吧。其实还能封装的更细节的,但怕越写越复杂难懂就点到即止了,例如:

  1. 自己重写一个类型用extends继承AxiosRequestConfig 和AxiosResponse使其在原有基础上更加灵活
  2. 对单个请求对请求config的处理,使每个请求有自己的拦截器,不传就用默认拦截器
  3. 封装到具体的get、post类型,而且不是传过去
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Vue 3 中使用 TypeScript 封装 axios 需要遵循以下步骤: 1. 安装 axios 和 @vue/cli-plugin-typescript: ``` npm install axios @vue/cli-plugin-typescript ``` 2. 在 Vue 项目的 main.ts 中导入 axios 并将其设置为 Vue.prototype 的一个属性,以便在组件中使用时可以直接访问: ``` import axios from 'axios'; Vue.prototype.$axios = axios; ``` 3. 在需要使用 axios 的组件中导入 axios: ``` import { AxiosInstance } from 'axios'; export default class MyComponent extends Vue { // 声明 $axiosAxiosInstance 类型 private $axios!: AxiosInstance; // 在组件中使用 axios async someMethod() { const response = await this.$axios.get('/some/endpoint'); // 处理响应 } } ``` 这样就可以在 Vue 3 项目中使用 TypeScript 封装 axios 了。 ### 回答2: Vue3和Typescript是一种常用的开发组合。封装Axios是为了在Vue3项目中更好地管理网络请求,并提供可复用的网络请求方法。 首先,我们需要安装Axios和相关类型声明文件。可以通过命令`npm install axios @types/axios`来安装。 接下来,在项目中创建一个名为`api.ts`的文件,用于封装Axios。我们可以定义一个基础的网络请求方法,并导出给其他组件使用。 ```typescript import axios, { AxiosInstance, AxiosResponse } from 'axios'; // 创建一个Axios实例 const instance: AxiosInstance = axios.create({ baseURL: 'http://api.example.com', // 设置接口的基础URL timeout: 5000, // 设置超时时间 }); // 定义一个通用的网络请求方法 const request = <T>(config: any): Promise<T> => { return new Promise((resolve, reject) => { instance.request(config) .then((response: AxiosResponse<T>) => { resolve(response.data); // 请求成功时,返回请求数据 }) .catch((error: any) => { reject(error); // 请求失败时,返回错误信息 }); }); }; export default request; ``` 现在,我们可以在其他组件中引入`api.ts`文件,并使用封装网络请求方法发送请求了。例如,假设我们要获取用户信息: ```typescript import request from './api.ts'; const getUserInfo = () => { const config = { url: '/user/info', method: 'get', params: { id: '123' }, }; return request<UserInfo>(config); // 使用request方法发送请求,并指定返回类型为UserInfo }; interface UserInfo { // 定义用户信息的接口 id: string; name: string; // 其他属性... } ``` 通过以上的封装,我们可以更好地管理项目中的网络请求,并在多个组件中复用同一网络请求方法。这种方式使得我们的代码更加简洁、易读和易于维护。 ### 回答3: Vue3是一种用于构建用户界面的JavaScript框架,而TypeScript是一种面向对象的编程语言。封装axios意味着创建一个可重复使用的函数,用于发送HTTP请求并处理响应。下面是一个使用Vue3和TypeScript封装axios的例子: 首先,我们需要安装axios和@types/axios包,分别用于发送HTTP请求和提供TypeScript类型定义。 ``` npm install axios npm install @types/axios ``` 接下来,我们创建一个名为request.ts的文件,用于封装axios。在此文件中,我们可以定义一个request函数,它接受一个config参数,用于配置请求,并返回一个Promise对象,该对象包含响应的数据。 ```typescript import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; export function request(config: AxiosRequestConfig): Promise<AxiosResponse> { return new Promise((resolve, reject) => { axios.request(config) .then((response: AxiosResponse) => { resolve(response); }) .catch((error: any) => { reject(error); }); }); } ``` 接下来,我们可以在Vue组件中使用封装axios函数。例如,在一个名为Example.vue的组件中,我们可以导入request函数并发送HTTP请求。 ```typescript <template> <div> <!-- ... --> </div> </template> <script setup lang="ts"> import { request } from './request'; request({ url: 'https://api.example.com/data' }) .then((response) => { // 处理响应 }) .catch((error) => { // 处理错误 }); </script> ``` 通过以上步骤,我们就成功地使用Vue3和TypeScript封装axios,使得在Vue组件中发送HTTP请求变得更加方便和可维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值