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

在使用 axios 进行 HTTP 请求时,使用 请求拦截器(Request Interceptor)和 响应拦截器(Response Interceptor)来对请求和响应进行自定义处理。

1. 请求拦截器 (Request Interceptor)

请求拦截器可以在请求发送之前对请求进行修改或做其他处理(比如添加认证信息、修改请求头等)。

语法:
axios.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    return config;
  },
  function (error) {
    // 请求错误时做些什么
    return Promise.reject(error);
  }
);
示例:在请求头中添加 Authorization token
axios.interceptors.request.use(
  function (config) {
    // 假设你有一个存储的 token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  function (error) {
    // 请求错误处理
    return Promise.reject(error);
  }
);

2. 响应拦截器 (Response Interceptor)

响应拦截器可以在响应数据到达时进行处理,通常用于统一处理错误或格式化响应数据。

语法:
axios.interceptors.response.use(
  function (response) {
    // 对响应数据做些什么
    return response;
  },
  function (error) {
    // 对响应错误做些什么
    return Promise.reject(error);
  }
);
示例:统一处理 API 错误
axios.interceptors.response.use(
  function (response) {
    // 对响应数据进行处理(比如统一格式化)
    return response.data; // 假设 API 返回的数据总是封装在 `data` 字段里
  },
  function (error) {
    // 请求失败时的统一错误处理
    if (error.response) {
      // 请求发出去并得到了响应
      console.error('Response error:', error.response);
    } else if (error.request) {
      // 请求已经发出但没有收到响应
      console.error('Request error:', error.request);
    } else {
      // 其他错误
      console.error('Error:', error.message);
    }
    return Promise.reject(error);
  }
);

3. 移除拦截器

你也可以在需要的时候移除拦截器,避免对后续请求产生影响。

const requestInterceptor = axios.interceptors.request.use(function (config) {
  // 添加自定义请求逻辑
  return config;
});

// 移除请求拦截器
axios.interceptors.request.eject(requestInterceptor);

const responseInterceptor = axios.interceptors.response.use(function (response) {
  // 处理响应数据
  return response;
});

// 移除响应拦截器
axios.interceptors.response.eject(responseInterceptor);

4. 总结

  • 请求拦截器:用于请求发出之前的处理(比如添加认证信息、修改请求头等)。
  • 响应拦截器:用于处理响应数据,通常用来做统一的错误处理或者数据格式的转换。

通过拦截器,能够方便地实现全局的错误捕获和请求/响应的统一处理,提升代码的复用性和可维护性。

### Axios 请求拦截器使用方法 #### 创建 Axios 实例并设置默认配置 为了更好地管理定制 HTTP 请求,通常会先创建一个 Axios 实例,并为其设定一些通用的选项,比如基础 URL 或者超时时间等。 ```javascript import axios from 'axios'; const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 1000, }); ``` #### 添加请求拦截器 请求拦截器允许在实际发起网络请求之前修改请求配置。这可以用来添加认证令牌、调整请求参数或是执行其他预处理逻辑。 ```javascript instance.interceptors.request.use( function(config) { // 在发送请求之前做一些事情 const token = localStorage.getItem('authToken'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, function(error) { // 处理请求错误 return Promise.reject(error); } )[^5]; ``` 上述代码展示了如何利用请求拦截器向每个请求自动附加授权头部信息。如果本地存储中有有效的身份验证令牌,则将其加入到请求头中以便服务器端识别用户身份[^3]。 #### 错误重试机制 除了简单的前置处理外,还可以实现更复杂的业务需求,例如当遇到特定类型的失败(如未登录状态码)时尝试重新获取新的访问凭证后再重发请求: ```javascript let isRefreshing = false; instance.interceptors.response.use(undefined, async function (error) { const originalRequest = error.config; if ( error.response.status === 401 && !originalRequest._retry ) { if (!isRefreshing) { isRefreshing = true; try { await refreshAccessToken(); // 自定义函数用于刷新access_token originalRequest.headers['Authorization'] = 'Bearer ' + getNewAccessToken(); isRefreshing = false; return instance(originalRequest); } catch (_error) { isRefreshing = false; throw _error; } } originalRequest._retry = true; return new Promise((resolve, reject) => { setTimeout(() => { resolve(instance(originalRequest)); }, 500); }); } return Promise.reject(error); })[^1]; ``` 这段脚本实现了对于HTTP 401 Unauthorized响应的状态检测,在这种情况下它会触发一次异步操作去更新过期的身份验证令牌,并再次提交原始请求直到成功为止或达到最大次数限制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值