1. // import axios from 'axios'
  2. // // 配置基地址
  3. // const request = axios.create({
  4. // baseURL: 'http://toutiao-app.itheima.net'
  5. // })
  6. // // request2可以按需的导出
  7. // export const request2 = axios.create({
  8. // baseURL: 'http://toutiao-app.itheima2.net2'
  9. // })
  10. // // 默认导出request
  11. // export default request
  12. import axios from 'axios'
  13. // 在普通的js文件中
  14. import store from '../store/index'
  15. // import router from '../router/auth'
  16. import router from '../router/auth'
  17. const request = axios.create({
  18. baseURL: 'http://localhost:8000'
  19. // baseURL: 'http://192.168.15.138:8000'
  20. // baseURL: 'http://192.168.15.28:8000'
  21. })
  22. // 请求拦截器
  23. request.interceptors.request.use(config => {
  24. // config就是本次请求用到的配置项
  25. const token = store.state.tokenInfo.token
  26. if (token) {
  27. // 看看有没有token,只要有token,就加上token,也就是就传递token
  28. config.headers.Authorization = `Bearer ${token}`
  29. }
  30. return config
  31. }, function (error) {
  32. // 对请求错误做些什么
  33. return Promise.reject(error)
  34. })
  35. // 响应拦截器
  36. request.interceptors.response.use(response => {
  37. return response
  38. }, async function (error) {
  39. // 如果发生了错误,判断是否是401(401就是token错误或者token失效了)
  40. console.dir(error)
  41. if (error.response.status === 401) {
  42. const refreshToken = store.state.tokenInfo.refresh_token
  43. if (refreshToken) {
  44. // 有的话请求新token
  45. try {
  46. const res = await axios({
  47. // 把地址写全是不用request有个请求拦截器(如果走请求拦击器就会补充一个错的token)了
  48. url: 'http://localhost:8000/v1_0/authorizations',
  49. method: 'PUT',
  50. headers: {
  51. Authorization: `Bearer ${refreshToken}`
  52. }
  53. })
  54. console.log(res)
  55. // 把新token保存到vuex中
  56. const newToken = res.data.data.token
  57. store.commit('mSetToken', { token: newToken, refresh_token: refreshToken })
  58. // error.config里面就保留着上次请求的所有参数,调用request请求就行
  59. return request(error.config)
  60. } catch (err) {
  61. // 1. 清空token
  62. store.commit('mSetToken', {})
  63. // 2. 回去登陆
  64. router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
  65. // 3. 返回错误信息
  66. return Promise.reject(new Error('请求新token失败'))
  67. }
  68. } else {
  69. // 1. 清空token
  70. store.commit('mSetToken', {})
  71. // 2. 回去登陆, 带上要返回的地址
  72. // router.currentRoute.fullPath// 获取到之前访问的路由地址
  73. router.push('/login?backto=' + encodeURIComponent(router.currentRoute.fullPath))
  74. // 3. 返回错误信息
  75. return Promise.reject(new Error('refresh_token不存在'))
  76. }
  77. }
  78. })
  79. // moudle.exports也是按需导出,但是一个页面中moudle.exports按需导出的时候
  80. // exports按需导出就不管用了
  81. // export是按需导出。注意导入按需导出的时候,需要用{}接收
  82. // export const request2 = axios.create({
  83. // baseURL: 'http://toutiao-app.itheima2.net2'
  84. // })
  85. // 默认导出一个页面只能有一个默认导出
  86. export default request

这个时候在api页面中导入request发axios的时候,就已经有请求和响应拦截器的功能了

正常情况下的请求拦截器

响应拦截器,中除了后端返回的有效数据,其他的都是axios给返回的