一、在文件src中创建request文件夹; 如下图
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107/*http.js*/ import axios from 'axios'; import QS from 'qs'; //命令: npm i qs import store from '@/store/store'; //axios import { Toast } from 'vant'; /** * 提示函数 * 禁止点击蒙层、显示一秒后关闭 */ const tip = msg => { Toast({ message: msg, duration: 1000, forbidClick: true }); } /** * 跳转登录页 * 携带当前页面路由,以期在登录页面完成登录后返回当前页面 */ const toLogin = () => { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }); } /** * 请求失败后的错误统一处理 * @param {Number} status 请求失败的状态码 */ const errorHandle = (status, other) => { // 状态码判断 switch (status) { // 401: 未登录状态,跳转登录页 case 401: toLogin(); break; // 403 token过期 // 清除token并跳转登录页 case 403: tip('登录过期,请重新登录'); localStorage.removeItem('token'); store.commit('loginSuccess', null); setTimeout(() => { toLogin(); }, 1000); break; // 404请求不存在 case 404: tip('请求的资源不存在'); break; default: console.log(other); }} // 创建axios实例 var instance = axios.create({ timeout: 1000 * 12}); // 设置post请求头 instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; /** * 请求拦截器 * 每次请求前,如果存在token则在请求头中携带token */ instance.interceptors.request.use( config => { // 登录流程控制中,根据本地是否存在token判断用户的登录情况 // 但是即使token存在,也有可能token是过期的,所以在每次的请求头中携带token // 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码 // 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。 const token = store.state.token; token && (config.headers.Authorization = token); return config; }, error => Promise.error(error)) // 响应拦截器 instance.interceptors.response.use( // 请求成功 res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res), // 请求失败 error => { const { response } = error; if (response) { // 请求已发出,但是不在2xx的范围 errorHandle(response.status, response.data.message); return Promise.reject(response); } else { // 处理断网的情况 // eg:请求超时或断网时,更新state的network状态 // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏 // 关于断网组件中的刷新重新获取数据,会在断网组件中说明 store.commit('changeNetwork', false); tip('网络异常!'); router.push({path:'refresh'}) } }); export default instance;
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/* index.js*/ /** * api接口的统一出口 */ // 文章模块接口 import article from './article'; // 其他模块的接口…… // 导出接口 export default { article, // …… }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13/*base.js*/ /** * 接口域名的管理 */ const base = { sq: 'https://xxxx111111.com/api/v1', bd: 'http://xxxx22222222.com/api/' } export default base;
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30/*article.js*/ /** * article模块接口列表 */ import base from './base'; // 导入接口域名列表 import axios from '@/request/http'; // 导入http中创建的axios实例 import qs from 'qs'; // 根据需求是否导入qs模块 const article = { // 新闻列表 articleList () { return axios.get(`${base.sq}/topics`); }, // 新闻详情,演示 articleDetail (id, params) { return axios.get(`${base.sq}/topic/${id}`, { params: params }); }, // post提交 login (params) { return axios.post(`${base.bd}/register/login`, qs.stringify(params)); } // 其他接口………… } export default article;
复制代码
1
2
3
4
5
6
7
8
9
10
11/* main.js */ import Vue from 'vue' import App from './App' import router from './router' // 导入路由文件 import store from './store/store' // 导入vuex文件 import api from './request/api' // 导入api接口 Vue.prototype.$api = api; // 将api挂载到vue的原型上复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
11/* 在页面中使用 */ test() { this.$api.article.login({ mobile: 1233354456677, pass: '123456' }).then(res=> { console.log(res) // 执行某些操作 }) },
https://www.cnblogs.com/chaoyuehedy/p/9931146.html
最后
以上就是包容路人最近收集整理的关于vue中axios的封装的全部内容,更多相关vue中axios内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复