0%

vue项目中网络请求axios的封装

最近打算自己手撸个后台管理项目练练手,封装好了axios请求,一直没有后台的支持,不知道哪里有问题也没敢放上来,今天简单的启了个express的接口,调通后特来记录下axios的封装过程,其中参考了axios中文文档和掘金上的这篇文章

安装axios
1
npm install axios --save

项目目录是这样的,在src目录下创建一个专门用来放网络请求的文件夹request,然后在文件夹下创建一个axios.js文件和api文件夹,axios的基本配置写在axios.js里,业务逻辑的接口代码放在api文件夹中,方便统一管理。
alt

在axios.js中引入

1
import axios from 'axios'

axios.js中的基本配置

弹出的提示,因为我全局用了element-ui所以弹窗直接用的是里边的组件,大家可以选择自己所用的UI框架的弹窗。

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
//创建实例
var instance = axios.create({
timeout: 1000 * 10 //设置请求超时
})

//设置post请求时添加请求头
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

//跳转登录,携带当前页面参数,登陆成功后跳转当前页
const toLogin = () => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
})
}

//请求拦截
instance.interceptors.request.use(
//发送请求前所做
config => {
return config
},
//请求失败
error => {
return Promise.reject(error)
}
)

//响应拦截
instance.interceptors.response.use(
response => {
//返回200请求成功,否则抛出异常
if(response.status === 200) {
return Promise.resolve(response)
}else{
return Promise.reject(response)
}
},
//错误处理
error => {
if(error.response.status){
switch(error.response.status){
//401未登录,跳转登录页并记录下当前页面路径,登陆成功后跳转回该页
case 401:
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
})
break;
//403登录失效,清除登录信息并重新登录
case 403:
//清除登录信息
//重新登录
setTimeout(() => {
toLogin
}, 1000);
break;
//404找不到页面
case 404:
this.$message({
message:"未找到页面",
type: "info"
})
break;
default:
this.$message({
message: error.response.data.msg,
type: "error"
})
}
return Promise.reject(error.response)
}
return Promise.reject(error)
}
)

export default instance
base.js

用来管理baseUrl,在多人合作的时候也能很方便。

1
2
3
4
5
6
const baseUrl = {
base:'http://localhost:3000',
baseTwo:'http://localhost:4000',
}

export default baseUrl

index.js

所有的需要导出的接口都写在api文件夹的index.js文件中统一管理

1
2
3
4
5
import loginModel from './login.js'

export default {
loginModel
}

login.js

真正的业务代码可以分模块放在不同的文件中,例如login模块

1
2
3
4
5
6
7
8
9
10
import axios from './../axios'
import baseUrl from './base'
import qs from 'qs'

const loginModel = {
login(params){
return axios.post(`${baseUrl.base}/login`,qs.stringify(params))
}
}
export default loginModel

main.js

最后还需要把axios挂载在vue原型上,这样就可以直接用this来调用了,在main.js文件夹中添加如下代码:

1
2
3
//挂载axios
import axios from './request/api/index.js'
Vue.prototype.$axios = axios

调用接口的时候直接用this.$axios对应的名字就能获取数据了

1
2
3
4
5
login(){
this.$axios.loginModel.login().then(res =>{
console.log(res)
})
}