axios配置请求失败时的拦截器,用于当请求失败时重新发送请求,或者提示

本文介绍了一个基于Axios的请求重试机制实现,通过配置重试次数、延迟时间及超时请求处理,确保网络不稳定时请求的成功率。文章详细解释了如何在Axios实例中设置重试参数,并在请求失败时自动进行重试。
import Axios from "axios";

import { API_ROOT, CONTENT_TYPE } from "./config";

// 创建axios实例对象

const REQUEST = Axios.create();

// 配置axios实例对象初始路径

REQUEST.defaults.baseURL = API_ROOT;

REQUEST.defaults.headers.post["Content-Type"] = CONTENT_TYPE;

// 请求失败重试次数

REQUEST.defaults.retry = 4;

// 请求重试延迟

REQUEST.defaults.retryDelay = 1000;

// 超时请求机制(未使用)

REQUEST.interceptors.response.use(undefined, function axiosRetryInterceptor(
  err
) {
  var config = err.config;

  // 如果配置不存在或未设置重试选项,则拒绝

  if (!config || !config.retry) return Promise.reject(err);

  // 设置变量以跟踪重试次数

  config.__retryCount = config.__retryCount || 0;

  // 检查我们是否已经注销了总重试次数

  if (config.__retryCount >= config.retry) {
    // 剔除错误

    return Promise.reject(err);
  }

  // 增加重试次数

  config.__retryCount += 1;

  // 创建新的异步对象来处理重试请求

  var backoff = new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, config.retryDelay || 1);
  });

  /**
  
  *
  
  Return the promise in which recalls axios to retry the request
  
  返回调用AXIOS来重试请求
  
  *
  
  * */

  return backoff.then(function() {
    return axios(config);
  });
});

 

<think>我们正在配置Axios拦截器。根据引用内容,我们需要创建一个Axios实例,然后为该实例添加请求拦截器和响应拦截器。 步骤: 1. 创建Axios实例(可选,如果不创建实例,可以直接使用axios全局对象,但通常创建实例更灵活) 2. 添加请求拦截器:在请求发送前对请求配置进行处理,例如添加token、修改请求头等。 3. 添加响应拦截器:在收到响应后对响应数据进行处理,例如统一处理错误、转换响应结构等。 我们将按照以下结构编写代码: - 创建axios实例 - 请求拦截器:在发送请求前做一些处理,比如设置请求头(例如Authorization) - 响应拦截器:处理响应数据,比如根据状态码进行全局错误处理 注意:根据引用[2]和引用[3],拦截器的使用方法是使用`interceptors`对象上的`request`和`response`的`use`方法。 我们将添加详细的注释说明每一步的作用。</think>以下是如何配置 Axios请求拦截器和响应拦截器的详细步骤及代码示例,包含完整注释说明: ### 1. 创建 Axios 实例 ```javascript // 导入 axios 库 import axios from 'axios'; // 创建自定义 Axios 实例(推荐) const request = axios.create({ baseURL: 'https://api.example.com', // 基础请求地址 timeout: 5000, // 请求间(毫秒) headers: { 'Content-Type': 'application/json' } // 默认请求头 }); ``` ### 2. 配置请求拦截器 ```javascript // 添加请求拦截器 request.interceptors.request.use( (config) => { /** * 在发送请求前执行的逻辑 * config 包含本次请求配置信息 */ // 示例1: 添加认证 token const token = localStorage.getItem('authToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; // 注入 token } // 示例2: 记录请求日志(开发环境) if (process.env.NODE_ENV === 'development') { console.log('[Request]', config.method.toUpperCase(), config.url); } // 必须返回修改后的 config 对象 return config; }, (error) => { /** * 请求错误处理(如配置无效) */ console.error('[Request Error]', error); return Promise.reject(error); // 将错误传递给后续处理 } ); ``` ### 3. 配置响应拦截器 ```javascript // 添加响应拦截器 request.interceptors.response.use( (response) => { /** * 处理成功响应(状态码 2xx) * response.data 包含服务端返回的数据 */ // 示例: 统一提取服务端业务数据 const res = response.data; if (res.code === 200) { return res.data; // 只返回业务数据 } else { // 业务逻辑错误处理 return Promise.reject(new Error(res.message || '业务错误')); } }, (error) => { /** * 处理失败响应(状态码非 2xx) * error.response 包含服务端返回的错误信息 */ // 统一错误处理 if (error.response) { switch (error.response.status) { case 401: console.error('未授权,请重新登录'); router.push('/login'); // 跳转登录页 break; case 403: console.error('拒绝访问'); break; case 500: console.error('服务器内部错误'); break; default: console.error(`请求错误: ${error.response.status}`); } } else if (error.request) { console.error('无响应:', error.request); // 请求已发出但无响应 } else { console.error('请求配置错误:', error.message); } return Promise.reject(error); // 继续传递错误 } ); ``` ### 4. 导出配置好的实例 ```javascript // 导出配置完成的实例 export default request; ``` ### 使用示例 ```javascript // 在组件中使用 import request from './request'; // 发送请求 request.get('/user/profile') .then(data => { console.log('获取用户数据:', data); }) .catch(error => { console.error('请求失败:', error); }); ``` ### 关键功能说明 1. **请求拦截器适用场景**: - 添加认证信息(如 JWT Token) - 设置全局请求头 - 请求参数加密/签名 - 请求日志记录[^2] 2. **响应拦截器适用场景**: - 统一处理 HTTP 错误状态码 - 提取核心业务数据(剥离外层包装) - 刷新过期的认证令牌 - 全局 loading 状态管理[^3] 3. **最佳实践**: - 为不同 API 服务创建独立实例 - 在拦截器中返回 `Promise.reject` 确保错误能被 `.catch` 捕获 - 生产环境移除调试日志 - 配合 `axios-retry` 实现自动重试机制 > 通过拦截器集中处理网络请求逻辑,可减少组件中的重复代码,实现统一错误处理和安全控制[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值