1. axios 是什么?
- 前端最流行的
ajax
请求库 - react/vue 官方都推荐使用 axios 发 ajax 请求
- 中文文档
2. 特点
- 基于 xhr + promise 的异步 ajax 请求库
- 浏览器端/node 端都可以使用
- 支持请求/响应拦截器
- 支持请求取消
- 请求/响应数据转换
- 批量发送多个请求
- 客户端支持防御 XSRF
3. axios 常用语法
axios(config)
: 通用/最本质的发任意类型请求的方式axios(url[, config])
: 可以只指定 url 发 get 请求axios.request(config)
: 等同于 axios(config)axios.get(url[, config])
: 发 get 请求axios.delete(url[, config])
: 发 delete 请求axios.post(url[, data, config])
: 发 post 请求axios.put(url[, data, config])
: 发 put 请求axios.defaults.xxx
: 请求的默认全局配置axios.interceptors.request.use()
: 添加请求拦截器axios.interceptors.response.use()
: 添加响应拦截器axios.create([config])
: 创建一个新的 axios(它没有下面的功能)axios.Cancel()
: 用于创建取消请求的错误对象axios.CancelToken()
: 用于创建取消请求的 token 对象axios.isCancel()
: 是否是一个取消请求的错误axios.all(promises)
: 用于批量执行多个异步请求axios.spread()
: 用来指定接收所有成功数据的回调函数的方法
4. 原理图
5. 难点语法的理解和使用
5.1 axios.create(config)
- 根据指定配置创建一个新的
axios
, 也就就每个新 axios 都有自己的配置 - 新 axios 只是没有取消请求和批量发请求的方法, 其它所有语法都是一致的
- 为什么要设计这个语法?
- 需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一样, 如何处理
- 解决: 创建 2 个新 axios, 每个都有自己特有的配置, 分别应用到不同要 求的接口请求中
const duanzi = axios.create({
baseURL: 'https://api.apiopen.top',
timeout: 2000
});
const onather = axios.create({
baseURL: 'https://b.com',
timeout: 2000
});
duanzi.get('/getJoke').then(response => {
console.log(response.data)
})
5.2 拦截器函数/ajax 请求/请求的回调函数的调用顺序
- 说明: 调用 axios()并不是立即发送 ajax 请求, 而是需要经历一个较长的流程
- 流程:
后声明的请求拦截器 => 先声明的请求拦截器 => 发ajax请求 => 先声明的响应拦截器 => 后声明的响应拦截器 => 请求的回调
- 注意: 此流程是通过 promise 串连起来的, 请求拦截器传递的是
config
, 响应 拦截器传递的是 response
axios.interceptors.request.use(function (config) {
console.log('请求拦截器 成功 - 1号');
config.params = {
a: 100
};
return config;
}, function (error) {
console.log('请求拦截器 失败 - 1号');
return Promise.reject(error);
});
axios.interceptors.request.use(function (config) {
console.log('请求拦截器 成功 - 2号');
config.timeout = 2000;
return config;
}, function (error) {
console.log('请求拦截器 失败 - 2号');
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器 成功 - 1号');
return response.data;
}, function (error) {
console.log('响应拦截器 失败 - 1号')
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器 成功 - 2号')
return response;
}, function (error) {
console.log('响应拦截器 失败 - 2号')
return Promise.reject(error);
});
axios({
method: 'GET',
url: 'http://localhost:3000/posts'
}).then(response => {
console.log('自定义回调处理成功的结果');
console.log(response);
});
5.3 取消请求
- 基本流程 配置
cancelToken
对象 缓存
用于取消请求的 cancel 函数- 在后面特定时机
调用
cancel 函数取消请求 - 在错误回调中判断如果 error 是 cancel, 做相应处理
- 实现功能 点击按钮, 取消某个正在请求中的请求
const btns = document.querySelectorAll('button');
let cancel = null;
btns[0].onclick = function () {
if (cancel !== null) {
cancel();
}
axios({
method: 'GET',
url: 'http://localhost:3000/posts',
cancelToken: new axios.CancelToken(function (c) {
cancel = c;
})
}).then(response => {
console.log(response);
cancel = null;
})
}
btns[1].onclick = function () {cancel(); }
6. 默认配置
axios.defaults.method = 'GET';
axios.defaults.baseURL = 'http://localhost:3000';
axios.defaults.params = {id:100};
axios.defaults.timeout = 3000;
btns[0].onclick = function(){
axios({
url: '/posts'
}).then(response => {
console.log(response);
})
}