axios全局配置loading及拦截器

21 篇文章 0 订阅
2 篇文章 0 订阅

先创建request.js

// 引入依赖
import axios from 'axios';
// 看实际需要
import { Message, Loading, MessageBox } from 'element-ui';

创建axios实例

const request = axios.create({
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
  timeout: 500000, // 请求超时时间
});

请求拦截器

        发送请求之前运行一般会判断是否有token,如果token存在则在请求头加上这个token。服务端会判断我这个token是否过期。可以设置加载全局loading。

// loading函数
// 记录请求次数
let needLoadingRequestCount = 0;
let loading;
function startLoading() {
  loading = Loading.service({
    lock: true,
    text: '加载中……',
    background: 'rgba(0, 0, 0, 0.5)',
  });
}
function endLoading() {
  // 延迟500ms,防止网速特快加载中画面一闪而过
  setTimeout(function () {
    if (loading) loading.close();
  }, 500);
}
// 打开loading
function showFullScreenLoading() {
  if (needLoadingRequestCount === 0) {
    startLoading();
  }
  needLoadingRequestCount++;
}
// 关闭loading
function tryHideFullScreenLoading() {
  if (needLoadingRequestCount <= 0) return;
  needLoadingRequestCount--;
  if (needLoadingRequestCount === 0) {
    endLoading();
  }
}
// request拦截器
request.interceptors.request.use(
  (config) => {
    // 打开loading
    showFullScreenLoading();
    const token = localStorage.getItem('token');
    if (token) {
      // 判断是否存在token,如果存在的话,则每个http header都加上token
      config.headers.authorization = token; //请求头加上token
    }
    return config;
  },
  (error) => {
    // 关闭loading
    tryHideFullScreenLoading();
    // Do something with request error
    Promise.reject(error);
  },
);

响应拦截器

        对服务端返回的数据进行处理,存储token,错误处理、登录、登录失效路由跳转、关闭全局loading等。

// respone拦截器
request.interceptors.response.use(
  (response) => {
    // 关闭loading
    tryHideFullScreenLoading();
    const res = response.data;
    if (!res.success) {
      // B002:Token 过期了;
      if (res.code === 'B002') {
        // 最后一次出弹框
        if (needLoadingRequestCount === 0) {
          MessageBox.confirm(
            `你已被登出,可以取消继续留在该页面,
            或者重新登录, 确定登出`,
            {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning',
            },
          ).then(() => {
            // 返回登录页
            // ...做些事情
            // 为了重新实例化vue-router对象 避免bug
            location.reload();
          });
        }
      } else {
        Message({
          message: res.msg,
          type: 'error',
        });
      }
      return Promise.reject(res.msg || 'error');
    } else {
      // 如果存在token
      let token = response.headers.authorization;
      if (token) {
        localStorage.setItem('token', token);
      }
      return response.data;
    }
  },
  (error) => {
    // 关闭loading
    tryHideFullScreenLoading();
    Message({
      message: error,
      type: 'error',
      duration: 2000,
    });
    return Promise.reject(error);
  },
);

 导出实例

export default request;

 创建api.js

import request from './request';
/* 验证登陆 */
export function login(data) {
  return request.post('/login', data);
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在Vue中使用axios实现全局拦截的方法如下: 首先,我们需要创建一个axios实例,可以在主文件中或者单独的一个文件中创建。根据引用中的代码,我们可以创建一个名为`service`的axios实例,设置基础URL、是否带cookie以及请求超时时间等参数。 接下来,我们可以使用`service.interceptors.request.use`来添加请求拦截器。在拦截器中,我们可以对请求做一些共同的处理,比如在请求头中添加token、loading效果等。在请求拦截器中,我们可以通过`config`参数来获取请求的相关信息,如请求的URL、请求方法等。 然后,我们可以使用`service.interceptors.response.use`来添加响应拦截器。在拦截器中,我们可以对响应做一些共同的处理,比如根据响应状态码进行错误处理、根据响应结果进行统一的提示等。在响应拦截器中,我们可以通过`response`参数来获取响应的相关信息,如响应的数据、响应的状态码等。 需要注意的是,拦截器是一个异步操作,所以在拦截器中如果需要使用异步操作,可以返回一个Promise对象或者使用async/await来处理。 总结一下,axios全局拦截可以通过创建axios实例,并使用`interceptors`属性来添加请求拦截器和响应拦截器来实现。这样可以对请求和响应进行统一的处理,提高代码的复用性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue axios全局拦截 get请求、post请求、配置请求的实例代码](https://download.csdn.net/download/weixin_38734200/12949432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [axios全局拦截+请求响应处理+路由拦截](https://blog.csdn.net/weixin_42484657/article/details/122365109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小•愿望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值