vue+ts封装axios网络请求封装方式

 更新时间:2025年12月06日 08:41:19   作者:仰望星空下的自己  
文章介绍了如何使用Vue和TypeScript封装Axios网络请求,并提供了一个示例文件`request.ts`,展示了如何封装各种请求,此外,还提到了路由管理文件和状态码处理文件的结构

vue+ts封装axios网络请求封装

request.ts 文件

import axios from 'axios';
import router from '@/router';
import StatusInit from '@/utils/status/StatusInit' // 状态码的策略模式

const CancelToken: any = axios.CancelToken; // axios 的取消请求

let token = localStorage.getItem('token');

const service = axios.create({
  baseURL: '', // 可以不需要
  timeout: 5000,  // 超时时间
  withCredentials: true,
  headers: {
    'version': '1.0.1', // 接口的版本号
    'Authorization': 'Bearer ' + token, // 向后台发送的token
    get: {
      'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
    },
    post: {
      'Content-Type': 'application/json;charset=utf-8'
    }
  },
  validateStatus () {
    return true;
  },

});

// 防止重复提交 利用axios的cancelToken
let pending: any[] = []; // 声明一个数组用于存储每个ajax请求的取消函数和ajax标识

/**
 * 取消重复请求
 * @param config
 * @param f
 */
const removePending: any = (config: any, f: any) => {
  const flgUrl = config.url;
  if ( pending.indexOf(flgUrl) !== -1 ) {
    if ( f ) {
      f('取消重复请求');
    } else {
      pending.splice(pending.indexOf( flgUrl ), 1); // 删除记录
    }
  } else {
    if ( f ) {
      pending.push( flgUrl );
    }
  }
}

/**
 * 请求拦截器
 */
service.interceptors.request.use(
  (config: any) => {
    if ( !config.neverCancel ) {
      // 生成canalToken
      config.cancelToken = new CancelToken((c: any) => {
        removePending(config, c);
      });
    }
    // 添加请求头以及其他逻辑处理
    return config;
  },
  (error: any) => {
    Promise.resolve(error);
  }
);

/**
 * 响应拦截器
 */
service.interceptors.response.use(
  (response: any) => {
    removePending( response.config );
    const res = response.data;
    // 后端status错误判断
    if ( res.status === 200 ) {
      let status = new StatusInit();
      status.init(res.status, res.msg, res);
      return Promise.resolve(res);
    } else {
      // 错误状态码处理
      return Promise.reject(res);
    }
  },
  (error: any) => {
    // Http错误状态码处理
    return Promise.reject(error);
  }
);


export default service;

各种请求的分装

import request from '../request/request';

/**
 * 封装get请求
 * @param {string} url 请求连接
 * @param {Object} params 请求参数
 * @param {Object} header 请求需要设置的header头
 */
export const get = (url: string, params: object, header: {}) => {
  return request({
    url: url,
    method: 'get',
    params: params,
    headers: header
  });
}

/**
 * 封装post请求
 * @param {string} url 请求连接
 * @param {Object} params 请求参数
 * @param {Object} header 请求的header头
 */
export const post = (url: string, params: object, header: {}) => {
  return request({
    url: url,
    method: 'post',
    data: params,
    headers: header
  });
}

/**
 * 封装put请求
 * @param {string} url 请求连接
 * @param {Object} params 请求参数
 * @param {Object} header 请求设置的header头
 */
export const put = (url: string, params: object, header: {}) => {
  return request({
    url: url,
    method: 'put',
    data: params,
    headers: header
  });
}

/**
 * 封装delete请求
 * @param {string} url 请求连接
 * @param {Object} params 请求参数
 * @param {Object} header 请求设置的header头
 */
export const del = (url: string, params: object, header: {}) => {
  return request({
    url: url,
    method: 'delete',
    data: params,
    headers: header
  });
}


路由管理文件 在这里可以写自己的路由信息

eg:

登录的路由 const login = ‘login’;

在module.exports 里面添加 login: login

const baseUrl = ''; //域名
const index = 'index'; // 首页路由

export default {
  baseUrl: baseUrl,
  index: index
}

请求以及接口路由调用文件

import {get, post, put, del} from '../utils/request/apiRequest'; // 引入各种请求方法
import api from './apiList'; // 引入请求api路由

/**
 * 首页接口请求
 */
const index = () => {
  let url = api.baseUrl + api.index;
  return get(url, {}, {});
}

export default {
  index: index
}

StatusInit.ts

import Status200 from '@/utils/status/statusCode/Status200';
import Status401 from '@/utils/status/statusCode/Status401';
import Status from '@/utils/status/status';

export default class StatusInit
{
  public init(status: number, msg: string, res: object)
  {
    let state: Status = null;
    switch ( status ) {
      case 200:
        state = new Status200();
        break;
      case 401:
        state = new Status401();
        break;
    }
    state.status(status, msg, res);
  }
}

status.ts

export default interface Status {
  status(state: number, msg: string, res: object): any;
}

Status200.ts(其他状态文件类似)

import Status from '@/utils/status/status';
import Message from '@/utils/Message/Message';

export default class Status200 implements Status
{
  public status(state: number, msg: string, res: object): any {
    let Message = new Message();
    Message.msg(msg, 'success', 1500, true, true, 100);
    return Promise.resolve(res);
  }
}

总结

以上经测可用,可能会有忘记添加的文件。

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 超详细的5个Shell脚本实例分享(值得收藏)

    超详细的5个Shell脚本实例分享(值得收藏)

    这篇文章主要介绍了超详细的5个Shell脚本实例分享(值得收藏),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 深度了解vue.js中hooks的相关知识

    深度了解vue.js中hooks的相关知识

    这篇文章主要介绍了深度了解vue.js中hooks的相关知识,生命周期钩子提供了一些 方法 ,因此你可以在组件生命周期的不同时刻精确地触发某些操作。当我们将组件实例化时,组件会被创建,反之会被销毁。,需要的朋友可以参考下
    2019-06-06
  • vue2封装input组件方式(输入的双向绑定)

    vue2封装input组件方式(输入的双向绑定)

    这篇文章主要介绍了vue2封装input组件方式(输入的双向绑定),具有很好的参考价值,希望对大家有所帮助。
    2023-04-04
  • Vue实现docx/xlsx/pdf等类型文件预览功能

    Vue实现docx/xlsx/pdf等类型文件预览功能

    这篇文章主要为大家详细介绍了如何溧阳Vue实现docx/xlsx/pdf等类型文件预览功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • 使用Vue3优雅地实现表格拖动排序

    使用Vue3优雅地实现表格拖动排序

    在 Vue.js 中主要通过第三方库实现表格拖动排序功能,其中最常用的库是 SortableJS,下面我们就来看看如何使用SortableJS实现表格拖动排序吧
    2025-01-01
  • vue elementUI日期报错dateObject.getTime is not a function问题及解决

    vue elementUI日期报错dateObject.getTime is not&nb

    文章描述了在使用Vue和Element UI时,日期选择器报错的问题,原因为rules中设置了type:'date',导致初始化为string类型,修改方法是初始化时间为new Date(),并去掉rules中的type:'date'
    2025-12-12
  • Vue echarts@4.x中国地图及AMap相关API使用详解

    Vue echarts@4.x中国地图及AMap相关API使用详解

    这篇文章主要为大家介绍了Vue使用echarts@4.x中国地图及AMap相关API使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • antd form表单中如何嵌套自定义组件

    antd form表单中如何嵌套自定义组件

    这篇文章主要介绍了antd form表单中如何嵌套自定义组件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Vue使用epubjs电子书的教程详解

    Vue使用epubjs电子书的教程详解

    EPUB.js是一个基于JavaScript的库,用于从电子书中提取内容,这篇文章主要为大家详细介绍了vue如何使用epubjs实现电子书的功能,感兴趣的小伙伴可以学习一下
    2023-11-11
  • Vue WebPack忽略指定文件或目录方式

    Vue WebPack忽略指定文件或目录方式

    这篇文章主要介绍了Vue WebPack忽略指定文件或目录方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论