注册

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

一、 拦截器介绍

一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器、响应拦截器。

  1. 请求拦截器
    在请求发送前进行必要操作处理,例如添加统一cookie、请求体加验证、设置请求头等,相当于是对每个接口里相同操作的一个封装;

  2. 响应拦截器
    同理,响应拦截器也是如此功能,只是在请求得到响应之后,对响应体的一些处理,通常是数据统一处理等,也常来判断登录失效等。

二、 Axios实例

  1. 创建axios实例

// 引入axios
import axios from 'axios'

// 创建实例
let instance = axios.create({
   baseURL: 'xxxxxxxxxx',
   timeout: 15000  // 毫秒
})
  1. baseURL设置:

let baseURL;
if(process.env.NODE_ENV === 'development') {
   baseURL = 'xxx本地环境xxx';
} else if(process.env.NODE_ENV === 'production') {
   baseURL = 'xxx生产环境xxx';
}

// 实例
let instance = axios.create({
   baseURL: baseURL,
   ...
})
  1. 修改实例配置的三种方式

// 第一种:局限性比较大
axios.defaults.timeout = 1000;
axios.defaults.baseURL = 'xxxxx';

// 第二种:实例配置
let instance = axios.create({
   baseURL: 'xxxxx',
   timeout: 1000,  // 超时,401
})
// 创建完后修改
instance.defaults.timeout = 3000

// 第三种:发起请求时修改配置、
instance.get('/xxx',{
   timeout: 5000
})

这三种修改配置方法的优先级如下:请求配置 > 实例配置 > 全局配置

三、 配置拦截器

// 请求拦截器
instance.interceptors.request.use(req=>{}, err=>{});
// 响应拦截器
instance.interceptors.reponse.use(req=>{}, err=>{});
  1. 请求拦截器

// use(两个参数)
axios.interceptors.request.use(req => {
   // 在发送请求前要做的事儿
   ...
   return req
}, err => {
   // 在请求错误时要做的事儿
   ...
   // 该返回的数据则是axios.catch(err)中接收的数据
   return Promise.reject(err)
})
  1. 响应拦截器

// use(两个参数)
axios.interceptors.reponse.use(res => {
   // 请求成功对响应数据做处理
   ...
   // 该返回的数据则是axios.then(res)中接收的数据
   return res
}, err => {
   // 在请求错误时要做的事儿
   ...
   // 该返回的数据则是axios.catch(err)中接收的数据
   return Promise.reject(err)
})
  1. 常见错误码处理(error)
    axios请求错误时,可在catch里进行错误处理。

axios.get().then().catch(err => {
   // 错误处理
})

四、 axios请求拦截器的案例

// 设置请求拦截器
axios.interceptors.request.use(
 config => {
   // console.log(config) // 该处可以将config打印出来看一下,该部分将发送给后端(server端)
   config.headers.Authorization = store.state.token
   return config // 对config处理完后返回,下一步将向后端发送请求
},
 error => { // 当发生错误时,执行该部分代码
   // console.log(error) // 调试用
   return Promise.reject(error)
}
)

// 定义响应拦截器 -->token值无效时,清空token,并强制跳转登录页
axios.interceptors.response.use(function (response) {
 // 响应状态码为 2xx 时触发成功的回调,形参中的 response 是“成功的结果”
 return response
}, function (error) {
 // console.log(error)
 // 响应状态码不是 2xx 时触发失败的回调,形参中的 error 是“失败的结果”
 if (error.response.status === 401) {
   // 无效的 token
   // 把 Vuex 中的 token 重置为空,并跳转到登录页面
   // 1.清空token
   store.commit('updateToken', '')
   // 2.跳转登录页
   router.push('/login')
}
 return Promise.reject(error)
})

作者:我彦祖不会秃
来源:https://juejin.cn/post/7100470316857557006

0 个评论

要回复文章请先登录注册