• vue 对axios进行封装


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

    废话少说直接上代码

    request.js 

    1. import axios from 'axios'
    2. // 使用element-ui Message做消息提醒
    3. import { ElMessage } from 'element-plus'
    4. //这是为了防止刁民反复切换页面,切换页面时对还在请求中的接口进行中断
    5. // const CancelToken = axios.CancelToken;
    6. // import pinia from '../store'
    7. // import { useNet } from '../store/net'
    8. // const net = useNet(pinia)
    9. import routes from '../router/index.js'
    10. //中英文,不使用注释掉,$t('xxx.xxx.xxx')改成你想要的提示
    11. import { translate as $t } from "../language/index"
    12. //创建axios
    13. const instance = axios.create({
    14. baseURL: process.env.BASE_API,
    15. timeout: 10000
    16. })
    17. //节流
    18. let lastTime = new Date().getTime()
    19. //防抖
    20. const debounceTokenCancel = new Map()
    21. //请求前拦截
    22. instance.interceptors.request.use(config => {
    23. const token = localStorage.getItem('token');
    24. config.headers = {
    25. //配置token
    26. 'Content-Type': 'application/json',
    27. 'T-Authorization': token,
    28. //中英文标识,判断当前中英文
    29. 'Accept-Language': localStorage.getItem("language") == null ? 'zh-CN' : localStorage.getItem("language") == 'zh' ? 'zh-CN' : 'en-US'
    30. }
    31. //切换页面强行中断请求
    32. // config.cancelToken = new CancelToken(c => {
    33. // net.cancel = c
    34. // })
    35. //请求接口进行标识
    36. const tokenKey = `${config.method}-${config.url}`
    37. //存在可以防抖的情况,取消请求
    38. const cancel = debounceTokenCancel.get(tokenKey)
    39. if (cancel) {
    40. cancel()
    41. }
    42. return new Promise(resolve => {
    43. let timer
    44. if (config.method == 'get') {
    45. //放行get请求
    46. resolve(config)
    47. } else if (config.method == 'post') {
    48. //开始节流
    49. const nowTime = new Date().getTime()
    50. if (nowTime - lastTime < 1000) {
    51. ElMessage.error({
    52. showClose: true,
    53. message: $t('text.Common.l25'),
    54. type: 'error',
    55. })
    56. return Promise.reject(new Error('节流处理中,稍后再试'))
    57. } else {
    58. //开始防抖
    59. lastTime = nowTime
    60. timer = setTimeout(() => {
    61. clearTimeout(timer)
    62. resolve(config)
    63. }, 10)
    64. //发生重复请求,进行取消
    65. debounceTokenCancel.set(tokenKey, () => {
    66. clearTimeout(timer)
    67. resolve(new Error('取消请求'))
    68. })
    69. }
    70. }
    71. })
    72. }, error => {
    73. console.log(error)
    74. return Promise.reject(error)
    75. })
    76. // let showError = false; // 新增一个变量来控制是否已经显示错误消息
    77. // let timerError = null; // 新增一个计时器
    78. //响应后拦截
    79. instance.interceptors.response.use(response => {
    80. if (response.data.code === 0) {
    81. return response.data.data
    82. } else {
    83. //跳转到登陆页面
    84. if (response.data.code == 402 || response.data.code == 401) {
    85. routes.push({ path: '/login' })
    86. }
    87. ElMessage.error({
    88. showClose: true,
    89. message: response.data.msg,
    90. type: 'error',
    91. })
    92. // if (!showError) { // 如果错误消息未显示
    93. // ElMessage.error({
    94. // showClose: true,
    95. // message: response.data.msg,
    96. // type: 'error',
    97. // })
    98. // showError = true; // 设置为已显示
    99. // // 设置一个计时器,在一段时间后重置 showError
    100. // timerError = setTimeout(() => {
    101. // showError = false;
    102. // clearTimeout(timerError);
    103. // }, 1000); // 1000毫秒后重置
    104. // }
    105. }
    106. //return response
    107. }, error => {
    108. //其它异常处理
    109. if (JSON.stringify(error).includes('500')) {
    110. ElMessage.error({
    111. showClose: true,
    112. message: $t('text.Common.l26'),
    113. type: 'error',
    114. })
    115. }
    116. return Promise.reject(error)
    117. })
    118. export default instance

    api.js:

    1. import request from "./request.js";
    2. const baseUrl = '/api'
    3. //post
    4. export function login(params) {
    5. return request({
    6. url: baseUrl + "/opsli-boot/system/login",
    7. method: "post",
    8. data: params
    9. });
    10. }
    11. //get
    12. export function findListByTypeCode(params) {
    13. return request({
    14. url: baseUrl + "/a123/b456",
    15. method: "get",
    16. });
    17. }

    使用: 

    1. import { getKey } from '../../http/api'
    2. getKey().then(res => {
    3. //在request进行了拦截,如果请求没成功是不返回的,判断成功时一定要判断res !== undefined
    4. if (res !== undefined) {
    5. console.log(res)
    6. }
    7. }).catch()

     

     

  • 相关阅读:
    OpenCV每日函数 相机校准calibrateCamera函数
    深入理解JVM虚拟机第六篇:内存结构与类加载子系统概述
    KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份
    【JVM笔记】方法的调用—虚方法与非虚方法
    kafka 消息偏移量
    Div4 思维总结
    会议OA项目---我的审批(审批&会议签字)
    国科大课程自动评价脚本JS
    Java中的设计模式:工厂模式
    鸿蒙应用开发之打包与上架
  • 原文地址:https://blog.csdn.net/qq_46149597/article/details/132690705