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);
  }
}

总结

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

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

相关文章

  • Vue使用路由钩子拦截器beforeEach和afterEach监听路由

    Vue使用路由钩子拦截器beforeEach和afterEach监听路由

    这篇文章主要介绍了Vue使用路由钩子拦截器beforeEach和afterEach监听路由,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 详解vue修改elementUI的分页组件视图没更新问题

    详解vue修改elementUI的分页组件视图没更新问题

    这篇文章主要介绍了详解vue修改elementUI的分页组件视图没更新问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Vue3中使用vue3-print-nb实现打印功能

    Vue3中使用vue3-print-nb实现打印功能

    这篇文章主要为大家详细介绍了Vue3中如何使用vue3-print-nb实现打印功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起参考一下
    2025-02-02
  • vue-esign用途及使用方法详细教程

    vue-esign用途及使用方法详细教程

    vue-esign作为基于Canvas API(浏览器提供的图形绘制接口)开发的专业签名组件,能够帮助开发者快速实现跨终端的手写签名功能,完美解决移动端适配与电子合同签署需求,这篇文章主要介绍了vue-esign用途及使用方法的相关资料,需要的朋友可以参考下
    2026-03-03
  • Vue.js进阶知识点总结

    Vue.js进阶知识点总结

    给大家分享了关于Vue.js想成为高手的5个总要知识点,需要的朋友可以学习下。
    2018-04-04
  • 详解element ui 添加自定义方法

    详解element ui 添加自定义方法

    今天在修改 el-table 源码过程中遇到一个头大的问题,原本修改编译后,将 element的子目录lib下的文件复制到项目的响应目录里就可以了,但是这次总出问题,下面小编给大家分享element ui 添加自定义方法,感兴趣的朋友一起看看吧
    2024-02-02
  • vue如何动态设置背景渐变色

    vue如何动态设置背景渐变色

    这篇文章主要介绍了vue如何动态设置背景渐变色问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Vue实现低版本浏览器升级提示的代码示例

    Vue实现低版本浏览器升级提示的代码示例

    在现代Web开发中,浏览器兼容性是一个重要的问题,尽管大多数用户已经转向了现代浏览器,但仍有一部分用户可能仍在使用老旧的浏览器版本,本文将详细介绍如何在Vue项目中实现低版本浏览器升级提示,并通过多个代码示例来展示不同的应用场景和技术点,需要的朋友可以参考下
    2024-10-10
  • Vue应用中504错误(Gateway timeout)的原因与解决方法

    Vue应用中504错误(Gateway timeout)的原因与解决方法

    在Vue前端应用中遇到504代理错误通常是由于请求在到达服务器之前超时,504错误表示网关超时,可能由后端服务响应慢、网络问题、代理配置错误、请求负载过大、前端请求超时设置不当、服务器资源不足或第三方服务问题引起
    2024-09-09
  • vue3+vite使用element-plus问题

    vue3+vite使用element-plus问题

    这篇文章主要介绍了vue3+vite使用element-plus问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论