vue 对axios进行封装

这篇具有很好参考价值的文章主要介绍了vue 对axios进行封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

token配置、中英文配置、对所有接口统一设置防抖、对所有post接口统一设置节流 

废话少说直接上代码

request.js 

import axios from 'axios'
// 使用element-ui Message做消息提醒
import { ElMessage } from 'element-plus'

//这是为了防止刁民反复切换页面,切换页面时对还在请求中的接口进行中断
// const CancelToken = axios.CancelToken;
// import pinia from '../store'
// import { useNet } from '../store/net'
// const net = useNet(pinia)
import routes from '../router/index.js'

//中英文,不使用注释掉,$t('xxx.xxx.xxx')改成你想要的提示
import { translate as $t } from "../language/index"

//创建axios
const instance = axios.create({
    baseURL: process.env.BASE_API,
    timeout: 10000
})
//节流
let lastTime = new Date().getTime()
//防抖
const debounceTokenCancel = new Map()

//请求前拦截
instance.interceptors.request.use(config => {

    const token = localStorage.getItem('token');
    config.headers = {
        //配置token
        'Content-Type': 'application/json',
        'T-Authorization': token,
        //中英文标识,判断当前中英文
        'Accept-Language': localStorage.getItem("language") == null ? 'zh-CN' : localStorage.getItem("language") == 'zh' ? 'zh-CN' : 'en-US'
    }
    //切换页面强行中断请求
    // config.cancelToken = new CancelToken(c => {
    //     net.cancel = c
    // })

    //请求接口进行标识
    const tokenKey = `${config.method}-${config.url}`
    //存在可以防抖的情况,取消请求
    const cancel = debounceTokenCancel.get(tokenKey)
    if (cancel) {
        cancel()
    }

    return new Promise(resolve => {
        let timer
        if (config.method == 'get') {
            //放行get请求
            resolve(config)
        } else if (config.method == 'post') {
            //开始节流
            const nowTime = new Date().getTime()
            if (nowTime - lastTime < 1000) {
                ElMessage.error({
                    showClose: true,
                    message: $t('text.Common.l25'),
                    type: 'error',
                })
                return Promise.reject(new Error('节流处理中,稍后再试'))
            } else {
                //开始防抖
                lastTime = nowTime
                timer = setTimeout(() => {
                    clearTimeout(timer)
                    resolve(config)
                }, 10)
                //发生重复请求,进行取消
                debounceTokenCancel.set(tokenKey, () => {
                    clearTimeout(timer)
                    resolve(new Error('取消请求'))
                })
            }
        }
    })
}, error => {
    console.log(error)
    return Promise.reject(error)
})


// let showError = false; // 新增一个变量来控制是否已经显示错误消息
// let timerError = null; // 新增一个计时器

//响应后拦截
instance.interceptors.response.use(response => {
    if (response.data.code === 0) {
        return response.data.data
    } else {
        //跳转到登陆页面
        if (response.data.code == 402 || response.data.code == 401) {
            routes.push({ path: '/login' })
        }
        ElMessage.error({
            showClose: true,
            message: response.data.msg,
            type: 'error',
        })
        // if (!showError) { // 如果错误消息未显示
        //     ElMessage.error({
        //         showClose: true,
        //         message: response.data.msg,
        //         type: 'error',
        //     })
        //     showError = true; // 设置为已显示
        //     // 设置一个计时器,在一段时间后重置 showError
        //     timerError = setTimeout(() => {
        //         showError = false;
        //         clearTimeout(timerError);
        //     }, 1000); // 1000毫秒后重置
        // }
    }
    //return response
}, error => {
    //其它异常处理
    if (JSON.stringify(error).includes('500')) {
        ElMessage.error({
            showClose: true,
            message: $t('text.Common.l26'),
            type: 'error',
        })
    }
    return Promise.reject(error)
})


export default instance

api.js:

import request from "./request.js";

const baseUrl = '/api'


//post
export function login(params) {
  return request({
    url: baseUrl + "/opsli-boot/system/login",
    method: "post",
    data: params
  });
}

//get
export function findListByTypeCode(params) {
  return request({
    url: baseUrl + "/a123/b456",
    method: "get",
  });
}

使用: 

        
import { getKey } from '../../http/api'

getKey().then(res => {
        //在request进行了拦截,如果请求没成功是不返回的,判断成功时一定要判断res !== undefined
            if (res !== undefined) {
                console.log(res)
            }
        }).catch()

 文章来源地址https://www.toymoban.com/news/detail-704225.html

 

到了这里,关于vue 对axios进行封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端vue3分享——项目封装axios、vite使用env环境变量

    大家好,我是yma16,本文分享关于前端vue3分享——项目封装axios、使用env环境变量。 该系列往期文章: csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板 认识vite_vue3 初始化项目到打包 什么是axios axios是一个流行的JavaScript库,用于在浏览器和Node.js环境中进行H

    2024年02月07日
    浏览(49)
  • 前端vue2中axios封装请求数据,教会你封装教会你请求数据 简单易懂,轻松学会axios封装请求数据 看一眼就会 手把手教会

    2、完成上面的步骤还不够,还需要再创建一个文件夹api,然后在文件夹里面创建自定义的文件名(我创建的是cartApi.js)文件名根据自己的需求命名 下面就是根据自己的请求接口以及数据参数请求,下面的请求是一些常见的post、get请求以及传参啥的(仅供参考,可以参考下面

    2024年02月03日
    浏览(30)
  • 【vue3】对axios进行封装,方便更改路由并且可以改成局域网ip访问(附代码)

    对axios封装是在main.js里面进行封装,因为main.js是一个vue项目的入口 在1处创建一个axios实例为http,baseURL是基础地址(根据自己的需求写),写了这个在vue界面调用后端接口时只用在post请求处写路由地址就可以了 在2处将创建的axios实例挂到app上 在3处,vue页面进行调用后端接

    2024年02月12日
    浏览(26)
  • 基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

    本图书管理系统是基于Vue、Ajax、Node.js等技术的管理系统,笔者给其命名为阳光图书管理系统,意味着我们这个年纪应该活得洒脱像阳光一样,应充满活力与信心。再此感谢老师朋友的悉心指导,由于此系统是笔者初次完成的一个小型管理系统,必定有许多纰漏,如有不足请指正。

    2024年02月09日
    浏览(45)
  • axios介绍以及对axios进行二次封装

    目录 一、axios基础 1、什么是axios? 2、axios的安装 3、axios常用配置项 4、axios和ajax的区别  二、使用axios发送请求 1、 发送get无参请求 2、 发送get有参请求 3、 发送post无参请求 4、 发送post有参请求 4.1 发送json格式的数据: 4.2 发送表单格式的数据: 三、 then、catch、finally 四、

    2023年04月14日
    浏览(31)
  • axios封装-reques.js

    参考网址:http://www.axios-js.com/zh-cn/docs/#axios-create-config 在现代的前端开发中,我们经常需要与后端API进行交互,而axios是其中的一个非常流行的选择。为了简化请求的处 理和增强代码的可读性,我们经常需要对axios进行封装。 我们会使用 axios 来请求 后端接口 , 一般都会对 a

    2024年01月21日
    浏览(20)
  • vue中axios的二次封装——vue 封装axios详细步骤

        api统一管理,不管接口有多少,所有的接口都可以非常清晰,容易维护。     通常我们的项目会越做越大,页面也会越来越多,如果页面非常的少,直接用axios也没有什么大的影响,那页面组件多了起来,上百个接口呢,这个时候后端改了接口,多加了一个参数什么的呢

    2024年02月02日
    浏览(33)
  • 前端进阶:Axios request 封装深入教程

    国企offer求比较 国企offer求比较 互联网VS国企央企,形势似乎又有新变化 腾讯网易米哈游,各游戏厂面试真题大公开 12月校招补录开启,职能大类岗位12.29已更新 12月校招补录开启,软开、IT信息大类岗位12.29已更新 中证登/中国结算深分体检后续 寒假别摆了,求个小老师。

    2024年02月20日
    浏览(45)
  • 关于前端开发中常用的 axios 封装

    前端、axios、网络请求 关于前端开发中常用的 axios 封装 jcLee95 的个人博客:https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/131099244 相关文章:[《flutter 中的 dio 模块用法解析与二次封装》](https://blog.csdn.net

    2024年02月08日
    浏览(33)
  • 前端开发中的ajax请求、axios封装

    目录 浏览器http请求 同步 js标签跨域、url 异步ajax、websock协议 ajax是异步的技术术语,最早的api是xhr(XMLHttpRequest) fetch es6 api axios 封装axios(无论用requst还是axios请求都会生效) src/utils/request.ts请求/响应拦截器封装 ts post请求request.post(url)和 通用请求request({url,method:\\\'post\\\'})对象

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包