当前位置:首页 > VUE

vue实现http拦截

2026-01-14 06:28:58VUE

使用 axios 拦截器

在 Vue 项目中,通常使用 axios 作为 HTTP 客户端。可以通过 axios 的拦截器机制实现请求和响应的拦截。

安装 axios:

npm install axios

创建 axios 实例并添加拦截器:

vue实现http拦截

import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com'
});

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 在发送请求前做些什么,例如添加 token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response.data;
  },
  error => {
    // 对响应错误做点什么
    if (error.response.status === 401) {
      // 处理未授权情况
      router.push('/login');
    }
    return Promise.reject(error);
  }
);

export default instance;

全局错误处理

可以在拦截器中统一处理错误,避免在每个请求中重复编写错误处理逻辑。

instance.interceptors.response.use(
  response => response,
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 400:
          notify.error('请求参数错误');
          break;
        case 500:
          notify.error('服务器错误');
          break;
        default:
          notify.error('未知错误');
      }
    }
    return Promise.reject(error);
  }
);

请求取消

在某些场景下可能需要取消请求,例如路由切换时取消未完成的请求。

vue实现http拦截

const CancelToken = axios.CancelToken;
let cancel;

instance.interceptors.request.use(config => {
  if (cancel) {
    cancel(); // 取消上一个请求
  }
  config.cancelToken = new CancelToken(c => {
    cancel = c;
  });
  return config;
});

加载状态管理

可以通过拦截器统一管理加载状态,配合 Vuex 或组件状态使用。

let requestCount = 0;

instance.interceptors.request.use(config => {
  requestCount++;
  store.commit('setLoading', true);
  return config;
});

instance.interceptors.response.use(
  response => {
    requestCount--;
    if (requestCount === 0) {
      store.commit('setLoading', false);
    }
    return response;
  },
  error => {
    requestCount--;
    if (requestCount === 0) {
      store.commit('setLoading', false);
    }
    return Promise.reject(error);
  }
);

重试机制

对于某些特定错误可以实现请求重试逻辑。

instance.interceptors.response.use(null, error => {
  const config = error.config;
  if (!config || !config.retry) return Promise.reject(error);

  config.__retryCount = config.__retryCount || 0;
  if (config.__retryCount >= config.retry) {
    return Promise.reject(error);
  }

  config.__retryCount += 1;
  return new Promise(resolve => {
    setTimeout(() => resolve(instance(config)), config.retryDelay || 1000);
  });
});

标签: vuehttp
分享给朋友:

相关文章

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: data…

vue 实现复选

vue 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现rtc

vue实现rtc

Vue 实现 RTC 的步骤 安装依赖 在 Vue 项目中安装 WebRTC 相关依赖,如 simple-peer 或 peerjs,用于简化 WebRTC 的实现。 运行以下命令安装 simple-…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue实现视频

vue实现视频

Vue 实现视频播放的方法 在 Vue 项目中实现视频播放可以通过多种方式完成,以下是几种常见的方法: 使用 HTML5 的 <video> 标签 在 Vue 组件中直接使用 HTML…