返回

Axios拦击器重发请求,更新token

前端

Axios拦截器:拦截HTTP请求和响应以增强应用程序功能

简介

Axios是一个强大的HTTP客户端库,为基于Promise的AJAX请求提供了便捷性。它包含众多特性,其中包括拦截器,它允许开发者在请求发送前或响应返回后执行特定任务。通过拦截器,开发者可以实现各种功能,例如添加或修改请求头、处理错误,以及重试请求。

重试请求

在某些情况下,请求可能会由于网络连接问题或服务器错误而失败。为了处理这种情况,可以使用Axios拦截器来重试请求。

创建一个请求拦截器,可以在请求发送前执行特定操作。在拦截器中,可以检查请求的状态码。如果状态码为401,表示请求未经授权。此时,开发者可以重试请求。

响应处理

除了重试请求,还可以使用响应拦截器来处理响应。创建一个响应拦截器,可以在响应返回后执行特定操作。在响应拦截器中,同样可以检查响应的状态码。如果状态码为401,表示请求未经授权。开发者可以更新令牌并重试请求。

代码示例

请求拦截器(重试请求):

axios.interceptors.request.use((config) => {
  // 在请求发送前执行特定操作
  if (config.url.includes('api') && config.headers.Authorization === undefined) {
    // 如果请求是针对API且未包含授权头,则添加授权头
    config.headers.Authorization = 'Bearer ' + localStorage.getItem('token');
  }
  return config;
}, (error) => {
  // 请求发送失败时执行特定操作
  return Promise.reject(error);
});

响应拦截器(更新令牌并重试请求):

axios.interceptors.response.use((response) => {
  // 在响应返回后执行特定操作
  return response;
}, (error) => {
  // 响应返回失败时执行特定操作
  if (error.response && error.response.status === 401) {
    // 如果响应状态码是401,则更新令牌并重试请求
    refreshToken().then(() => {
      error.config.headers.Authorization = 'Bearer ' + localStorage.getItem('token');
      return axios(error.config);
    }).catch(() => {
      // 令牌更新失败,则注销用户
      logout();
    });
  }
  return Promise.reject(error);
});

总结

Axios拦截器提供了一种简单高效的方法来拦截Axios请求和响应,并可用于各种目的,包括更新令牌、重试请求,以及处理错误。通过使用Axios拦截器,开发者可以确保前端应用程序持续访问受保护的API,并提供更好的用户体验。

常见问题解答

1. Axios拦截器可以拦截所有请求和响应吗?
是的,Axios拦截器可以拦截所有请求和响应。

2. 是否可以同时注册多个拦截器?
是的,可以同时注册多个拦截器。拦截器将按照注册顺序依次执行。

3. 如何删除Axios拦截器?
可以使用eject()方法删除Axios拦截器。

4. Axios拦截器可以与其他Axios特性一起使用吗?
是的,Axios拦截器可以与其他Axios特性一起使用,例如取消请求和自动重试。

5. 是否有第三方库可以扩展Axios拦截器的功能?
是的,有第三方库可以扩展Axios拦截器的功能,例如axios-retry