QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2338|回复: 0

[VUE] Vue中Axios API接口的管理

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1295 小时
   最后登录 : 2024-11-24

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-1-11 14:13:40 | 显示全部楼层 |阅读模式
       整齐的api就像电路板一样,即使再复杂也能很清晰整个线路。上面说了,我们会新建一个api.js,然后在这个文件中存放我们所有的api接口。/ q  A$ c9 J) s
1.jpg
, C; I% H6 W1 g/ m. Y       首先我们在api.js中引入我们封装的get和post方法:( M& ~! p8 \' c1 U1 [& I
  1. /**   
  2. * api接口统一管理
  3. */
  4. import { get, post } from './http'
      现在,例如我们有这样一个接口,是一个post请求:http://www.baiodu.com/api/v1/users/my_address/address_edit_before       我们可以在api.js中这样封装:
* `9 O6 |) p, e( P: ]3 V3 Z
  1. export const apiAddress = p => post('api/v1/users/my_address/address_edit_before', p);
      我们定义了一个apiAddress方法,这个方法有一个参数p,p是我们请求接口时携带的参数对象。而后调用了我们封装的post方法,post方法的第一个参数是我们的接口地址,第二个参数是apiAddress的p参数,即请求接口时携带的参数对象。最后通过export导出apiAddress。# W8 D# T& [. l
       然后在我们的页面中可以这样调用我们的api接口:# V* {. x7 O& E/ X# d1 Q' A
6 S! v" F8 A5 h& P3 \
  1. import { apiAddress } from '@/request/api';// 导入我们的api接口
  2. export default {        
  3.     name: 'Address',   
  4.     created () {
  5.         this.onLoad();
  6.     },
  7.     methods: {            
  8.         // 获取数据            
  9.         onLoad() {
  10.             // 调用api接口,并且提供了两个参数               
  11.             apiAddress({                    
  12.                 type: 0,                    
  13.                 sort: 1               
  14.             }).then(res => {
  15.                 // 获取数据成功后的其他操作
  16.                 ………………               
  17.             })            
  18.         }        
  19.     }
  20. }
      其他的api接口,就在pai.js中继续往下面扩展就可以了。友情提示,为每个接口写好注释哦!!!
$ ^" z0 n  ~1 H& N; e; _       api接口管理的一个好处就是,我们把api统一集中起来,如果后期需要修改接口,我们就直接在api.js中找到对应的修改就好了,而不用去每一个页面查找我们的接口然后再修改会很麻烦。关键是,万一修改的量比较大,就规格gg了。还有就是如果直接在我们的业务代码修改接口,一不小心还容易动到我们的业务代码造成不必要的麻烦。. X2 t" G( M* }
       好了,最后把完成的axios封装代码奉上。0 o0 Q% ~. S  P# j' {

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

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-24 12:15

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表