当前位置:   article > 正文

axios、axios二次封装、api解耦

axios、axios二次封装、api解耦
  1. import axios from 'axios'
  2. // 环境的切换切换测试与生产环境
  3. if (process.env.NODE_ENV == 'development') {
  4. axios.defaults.baseURL = '/api';
  5. } else if (process.env.NODE_ENV == 'debug') {
  6. axios.defaults.baseURL = '';
  7. } else if (process.env.NODE_ENV == 'production') {
  8. axios.defaults.baseURL = 'http://api.123dailu.com/';
  9. }
  10. // 请求超时时间
  11. axios.defaults.timeout = 10000;
  12. // post请求头
  13. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  14. // 请求拦截器
  15. axios.interceptors.request.use(
  16. config => {
  17. // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
  18. // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
  19. const token = store.state.token;
  20. token && (config.headers.Authorization = token);
  21. return config;
  22. },
  23. error => {
  24. return Promise.error(error);
  25. })
  26. // 响应拦截器
  27. axios.interceptors.response.use(
  28. response => {
  29. if (response.status === 200) {
  30. return Promise.resolve(response);
  31. } else {
  32. return Promise.reject(response);
  33. }
  34. },
  35. // 服务器状态码不是200的情况
  36. error => {
  37. if (error.response.status) {
  38. switch (error.response.status) {
  39. // 401: 未登录
  40. // 未登录则跳转登录页面,并携带当前页面的路径
  41. // 在登录成功后返回当前页面,这一步需要在登录页操作。
  42. case 401:
  43. router.replace({
  44. path: '/login',
  45. query: { redirect: router.currentRoute.fullPath }
  46. });
  47. break;
  48. // 403 token过期
  49. // 登录过期对用户进行提示
  50. // 清除本地token和清空vuex中token对象
  51. // 跳转登录页面
  52. case 403:
  53. Toast({
  54. message: '登录过期,请重新登录',
  55. duration: 1000,
  56. forbidClick: true
  57. });
  58. // 清除token
  59. localStorage.removeItem('token');
  60. store.commit('loginSuccess', null);
  61. // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
  62. setTimeout(() => {
  63. router.replace({
  64. path: '/login',
  65. query: {
  66. redirect: router.currentRoute.fullPath
  67. }
  68. });
  69. }, 1000);
  70. break;
  71. // 404请求不存在
  72. case 404:
  73. Toast({
  74. message: '网络请求不存在',
  75. duration: 1500,
  76. forbidClick: true
  77. });
  78. break;
  79. // 其他错误,直接抛出错误提示
  80. default:
  81. Toast({
  82. message: error.response.data.message,
  83. duration: 1500,
  84. forbidClick: true
  85. });
  86. }
  87. return Promise.reject(error.response);
  88. }
  89. }
  90. );
  91. /**
  92. * get方法,对应get请求
  93. * @param {String} url [请求的url地址]
  94. * @param {Object} params [请求时携带的参数]
  95. */
  96. export function get(url, params){
  97. return new Promise((resolve, reject) =>{
  98. axios.get(url, {
  99. params: params
  100. })
  101. .then(res => {
  102. resolve(res.data);
  103. })
  104. .catch(err => {
  105. reject(err.data)
  106. })
  107. });
  108. }
  109. /**
  110. * post方法,对应post请求
  111. * @param {String} url [请求的url地址]
  112. * @param {Object} params [请求时携带的参数]
  113. */
  114. export function post(url, params) {
  115. return new Promise((resolve, reject) => {
  116. axios.post(url, QS.stringify(params))
  117. .then(res => {
  118. resolve(res.data);
  119. })
  120. .catch(err => {
  121. reject(err.data)
  122. })
  123. });
  124. }

响应拦截器可以对返回值进行封装

例如未封装前

  1. getMenuData({
  2. id: xxxx,
  3. name: 'xxxx'
  4. })
  5. .then(response => {
  6. this.menu = response.data.list
  7. })

封装后

return response.data

 就可以这样写

  1. getMenuData({
  2. id: xxxx,
  3. name: 'xxxx'
  4. })
  5. .then(response => {
  6. this.menu = response.list
  7. })

具体情况要看后端返回的字段 

然后就可以使用api

  1. export function getMenuData(data) {
  2. return request({
  3. url: '/xxx/xxx/xxxx', //接口url
  4. method: 'post', //根据后端的方式选择 请求类型
  5. data:data
  6. //data 是一个参数,它用来传递给 getMenuData 函数的数据。这个参数的具体含义取决于函数被调用时传递给它的值。在这个函数中,data 被用作一个对象,作为 HTTP 请求的数据参数传递给 request 函数。通常情况下,data 可能包含了需要发送给服务器的信息,比如用户输入的数据、配置信息等。
  7. })
  8. }
  9. /*export function getMenuData(data) {
  10. return axios.request({
  11. url: '/api/xxx/getallgroup',
  12. method: 'post',
  13. data:data
  14. })
  15. }*/
  16. /*export function getMenuData() {
  17. return axios.post('/api/xxx/getallgroup', {
  18. id: 1,
  19. name: '统计信息类别名称'
  20. });
  21. }*/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/304581
推荐阅读
相关标签
  

闽ICP备14008679号