// import axios from 'axios'
// // 配置基地址
// const request = axios.create({
// baseURL: 'http://toutiao-app.itheima.net'
// })
// // request2可以按需的导出
// export const request2 = axios.create({
// baseURL: 'http://toutiao-app.itheima2.net2'
// })
// // 默认导出request
// export default request
import axios from 'axios'
// 在普通的js文件中
import store from '../store/index'
// import router from '../router/auth'
import router from '../router/auth'
const request = axios.create({
baseURL: 'http://localhost:8000'
// baseURL: 'http://192.168.15.138:8000'
// baseURL: 'http://192.168.15.28:8000'
})
// 请求拦截器
request.interceptors.request.use(config => {
// config就是本次请求用到的配置项
const token = store.state.tokenInfo.token
if (token) {
// 看看有没有token,只要有token,就加上token,也就是就传递token
config.headers.Authorization = `Bearer ${token}`
}
return config
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error)
})
// 响应拦截器
request.interceptors.response.use(response => {
return response
}, async function (error) {
// 如果发生了错误,判断是否是401(401就是token错误或者token失效了)
console.dir(error)
if (error.response.status === 401) {
const refreshToken = store.state.tokenInfo.refresh_token
if (refreshToken) {
// 有的话请求新token
try {
const res = await axios({
// 把地址写全是不用request有个请求拦截器(如果走请求拦击器就会补充一个错的token)了
url: 'http://localhost:8000/v1_0/authorizations',
method: 'PUT',
headers: {
Authorization: `Bearer ${refreshToken}`
}
})
console.log(res)
// 把新token保存到vuex中
const newToken = res.data.data.token
store.commit('mSetToken', { token: newToken, refresh_token: refreshToken })
// error.config里面就保留着上次请求的所有参数,调用request请求就行
return request(error.config)
} catch (err) {
// 1. 清空token
store.commit('mSetToken', {})
// 2. 回去登陆
router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
// 3. 返回错误信息
return Promise.reject(new Error('请求新token失败'))
}
} else {
// 1. 清空token
store.commit('mSetToken', {})
// 2. 回去登陆, 带上要返回的地址
// router.currentRoute.fullPath// 获取到之前访问的路由地址
router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
// 3. 返回错误信息
return Promise.reject(new Error('refresh_token不存在'))
}
}
})
// moudle.exports也是按需导出,但是一个页面中moudle.exports按需导出的时候
// exports按需导出就不管用了
// export是按需导出。注意导入按需导出的时候,需要用{}接收
// export const request2 = axios.create({
// baseURL: 'http://toutiao-app.itheima2.net2'
// })
// 默认导出一个页面只能有一个默认导出
export default request
这个时候在api页面中导入request发axios的时候,就已经有请求和响应拦截器的功能了
正常情况下的请求拦截器
响应拦截器,中除了后端返回的有效数据,其他的都是axios给返回的