一. 什么是axios
- Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
- 官方文档
二. 如何安装到项目中
1 | npm install axios |
三. 如何在项目中使用
如何发送GET请求
1
2
3
4
5
6
7
8
9axios.get('http://jsonplaceholder.typicode.com/posts',{
params:{ id:1 } // ?拼接的方式传参
})
.then((res)=>{ // 请求成后的回调
console.log(res);
})
.catch((error)=>{// 任何错误的出口
console.log(error);
})如何发送POST请求
1
2
3
4
5
6
7
8
9axios.post('https://jsonplaceholder.typicode.com/posts',{
id:1 // // post传参
})
.then((res)=>{ // 请求成后的回调
console.log(res);
})
.catch((error)=>{// 任何错误的出口
console.log(error);
})使用对象的方式
1
2
3
4
5
6
7
8
9
10
11axios({
method: 'post', // 请求方式
url: '/user/12345', // 请求地址
data: { // 请求参数
firstName: 'Fred',
lastName: 'Flintstone'
},
headers:{}, // 设置自定义请求头
timeout:5, // 请求中断时间 超过5秒 自动请求失败
···// 更多查看官方文档
});
无论是哪一种方式传参返回 回来的都是响应的主体。它们中我们仅需要的就是data 如何让返回结果只包含data,请求携带token呢?
四. axios拦截器的使用
- 什么是拦截器:
- 请求拦截器在请求发送之前我们需要做的一些事,它们需要我们反复的添加并且一样。比如添加token验证,参数序列化,修改请求头,等操作
- 响应拦截器在响应回来我们需要做的一些事,它们需要我们反复的添加,修改并且一样。比如简化请求返回体,一致的状态码返回处理,等
全局请求拦截器
1
2
3
4
5
6
7
8
9
10
11
12axios.interceptors.request.use(
(config) => {// 在发送请求之前做些什么
// 我们可以在这里添加网站的token验证
// if (getToken()) { // 判断是否存在token,如果存在的话,则每个http header都加上token
// config.headers.Authorization = `${getToken()}`;
// }
return config;
},
(error) => {// 对请求错误做些什么
return Promise.reject(error);
}
);全局响应拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13axios.interceptors.response.use(
(response) => { // 对响应数据做点什么
// 在这里我们可以将请求体简化
let data = response.data;
if(data.status === 4009){
// console.log('登录失效了')
// location.href = 'login.html'// 直接跳转登录页
}
return data; // 最后将数据返回出去
},
(error) => {// 对响应错误做点什么
return Promise.reject(error);
});
了解完以上内容我们就可以自己封装一个axios请求的方法了,不过我们可以在了解下其他的,这样会更加的有利于我们封装
五. 全局参数设置
- 全局默认请求地址前缀。
- axios.defaults.baseURL = ‘https://api.example.com';
- 全局默认请求token
- axios.defaults.headers.common[‘Authorization’] = AUTH_TOKEN;
- 全局post默认请求头
- axios.defaults.headers.post[‘Content-Type’] = ‘application/x-www-form-urlencoded’;
- 全局参数默认序列化(坑)
不过我们不用这个。我们有更好的东西1
2
3
4
5
6
7axios.defaults.transformRequest = [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
六. 在Vue中封装一个axios
通过上面的只是储备,我们闲话不多说,开始封装
- 安装axios
- npm i axios
- npm i qs // 使用qs 代替axios中的参数序列化方法
在发送post请求,不将参数序列化,当你请求的时候会一直报错(400,传参错误)。原因就是你参数后台识别不了
- 在src目录下创建 api文件夹
在api文件夹下创建ajax.js
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// src/api/ajax.js
import axios from 'axios'
import qs from 'qs'
// 设置全局axios 配置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.baseURL = 'http://wwww.xxx.com';// 请求都是 http://wwww.xxx.com 开头 + url
// 设置请求拦截器
axios.interceptors.request.use(
(config) => {// 在发送请求之前做些什么
// if (getToken()) { config.headers.Authorization = `${getToken()}`; }
return config;
},
(error) => {// 对请求错误做些什么
return Promise.reject(error);
});
axios.interceptors.response.use(
(response) => { // 对响应数据做点什么
let data = response.data;
if(data.status === 4009){
// console.log('登录失效了')
}
return data; // 最后将数据返回出去
},
(error) => {// 对响应错误做点什么
return Promise.reject(error);
});
//重新定义post请求
export const post = (url, params) => {
return axios({
method: 'post',
url: `${url}`,
data: qs.stringify(params),
});
};
//重新定义get请求
export const get = (url,params) => {
return axios({
method: 'get',
url: `${url}`,
params
});
};如何全局使用
在main.js 将其挂载到Vue上1
2
3import { post, get } from './api/ajax'
Vue.prototype.$post = post
Vue.prototype.$get = get模块化请求url
在api目录下 新增项目对应的模块js文件(便于维护)1
2
3// src/api/url
export const login = '/front/customer/login' // 用户登录 ?phone=''&password=''
export const shopping = '/front/goods/goodsGroup' // 获取商品如何使用
我们将方法挂载到Vue上后就可以使用this.$post/this.$get 来获取了
1 | <!-- 页面 --> |