axios 请求拦截器和 响应拦截器总结

请求拦截器响应拦截器axios 提供的强大功能,用于在请求发送前和响应返回后统一处理某些逻辑。它们的作用和具体用法如下:


1. 请求拦截器

作用

在请求发送之前,对请求配置进行统一处理。例如:

  • 添加请求头(如 Authorization)。
  • 修改请求参数。
  • 显示加载状态。
用法

通过 axios.interceptors.request.use 方法注册请求拦截器。

示例
instance.interceptors.request.use(
  (config) => {
    // 在请求发送之前做一些处理
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`; // 添加 token 到请求头
    }
    return config; // 返回处理后的配置
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);
场景
  • 添加认证信息(如 token)。
  • 统一添加请求头(如 Content-Type)。
  • 在发送请求前显示加载动画。

2. 响应拦截器

作用

在响应返回之后,对响应数据进行统一处理。例如:

  • 统一处理错误状态码。
  • 提取响应数据。
  • 隐藏加载状态。
用法

通过 axios.interceptors.response.use 方法注册响应拦截器。

示例
instance.interceptors.response.use(
  (response) => {
    // 对响应数据做些什么
    const { code, message, data } = response.data;
    if (code === 0) {
      return data; // 返回实际数据
    } else {
      ElMessage.error(message || '请求失败'); // 显示错误提示
      return Promise.reject(new Error(message || '请求失败')); // 抛出错误
    }
  },
  (error) => {
    // 对响应错误做些什么
    ElMessage.error(error.message || '网络错误'); // 显示网络错误提示
    return Promise.reject(error); // 抛出错误
  }
);
场景
  • 统一处理后端返回的错误码。
  • 提取响应中的实际数据。
  • 在响应返回后隐藏加载动画。

完整示例

以下是一个完整的 request.ts 文件,包含请求拦截器和响应拦截器的实现:

import axios from 'axios';
import { ElMessage } from 'element-plus';

// 创建 axios 实例
const instance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 基础 URL
  timeout: 10000, // 请求超时时间
});

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`; // 添加 token 到请求头
    }
    return config; // 返回处理后的配置
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 对响应数据做些什么
    const { code, message, data } = response.data;
    if (code === 0) {
      return data; // 返回实际数据
    } else {
      ElMessage.error(message || '请求失败'); // 显示错误提示
      return Promise.reject(new Error(message || '请求失败')); // 抛出错误
    }
  },
  (error) => {
    // 对响应错误做些什么
    ElMessage.error(error.message || '网络错误'); // 显示网络错误提示
    return Promise.reject(error); // 抛出错误
  }
);

// 封装常用请求方法
export const request = {
  get(url, params = {}) {
    return instance.get(url, { params });
  },
  post(url, data = {}) {
    return instance.post(url, data);
  },
  put(url, data = {}) {
    return instance.put(url, data);
  },
  delete(url, params = {}) {
    return instance.delete(url, { params });
  },
};

export default request;

使用示例

1. 发送 GET 请求
import { request } from '@/utils/request';

const fetchData = async () => {
  try {
    const data = await request.get('/api/data');
    console.log(data);
  } catch (error) {
    console.error('请求失败:', error);
  }
};
2. 发送 POST 请求
import { request } from '@/utils/request';

const submitForm = async () => {
  try {
    const response = await request.post('/api/submit', { name: 'John' });
    console.log(response);
  } catch (error) {
    console.error('提交失败:', error);
  }
};

总结

  • 请求拦截器:用于在请求发送前统一处理逻辑(如添加请求头)。
  • 响应拦截器:用于在响应返回后统一处理逻辑(如提取数据、处理错误)。
  • 优势:减少重复代码,提高代码可维护性,统一处理公共逻辑。

通过合理使用请求拦截器和响应拦截器,可以显著提升代码质量和开发效率。

在 Soybean 中使用 Axios 时,请求拦截器响应拦截器具有重要作用。 请求拦截器请求发送之前被触发,可以对请求配置进行修改处理。例如,可以在请求头中添加认证信息(如 token),统一处理请求参数,或者对请求进行日志记录等。以下是一个请求拦截器的示例代码: ```javascript import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }); service.interceptors.request.use( config => { // 在请求头中添加 token const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => { console.log(error); return Promise.reject(error); } ); ``` 在上述代码中,请求拦截器会在每个请求发送之前检查本地存储中是否存在 token,如果存在则将其添加到请求头的 `Authorization` 字段中,从而实现身份验证的统一处理[^1]。 响应拦截器在接收到响应之后、处理响应数据之前被触发,可以对响应数据进行统一处理,例如错误处理、数据格式化等。以下是一个响应拦截器的示例代码: ```javascript service.interceptors.response.use( response => { const res = response.data; // 处理响应数据 if (res.code !== 200) { console.error('请求失败'); return Promise.reject(new Error(res.message || 'Error')); } else { return res; } }, error => { console.log('err' + error); return Promise.reject(error); } ); ``` 在这个示例中,响应拦截器会检查响应数据的状态码,如果状态码不是 200,则认为请求失败,输出错误信息并拒绝 Promise。这样可以在一个地方统一处理请求失败的情况,避免在每个请求中重复编写错误处理代码[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值