1. axios特点(面试常问)
- 基本promise的异步ajax请求库
- 浏览器端/node端都可以使用
- 支持请求/响应拦截器
- 支持请求取消
- 请求/响应数据转换
- 批量发送多个请求
- 有效防御xsrf攻击
2. axios常用语法
axios(config):通过/最本质的发任意请求的方式 axios(url,config):可以只指定url发get请求 axios.request(config):等同于axios(config) axios.get(url[,config):发get请求 axios.delete(url[,config):发getdelete请求 axios.post(url[,data,config):发post请求 axios.put(url[,data,config):发put请求 axios.defaults.xxx:请求的默认全局配置 axios.interceptors.request.use():添加请求拦截器 axios.interceptors.reponse.use():添加相应拦截器 axios.create([config]):创建一个新的axios(他没有下面的功能) axios.Cancel():用于创建取消请求的错误对象 axios.CancelToken():用于创建取消请求的token axios.isCancel():是否是一个取消请求的错误 axios.all(promise):用于批量执行多个异步请求 axios.spread():用来指定接受所有成功数据的回调函数的方法
3. 难点语法的理解和使用
3.1. axios.create(config)
- 根据指定配置创建一-个新的axios,也就就每个新axios都有自己的配置
- 新axios只是没有取消请求和批量发请求的方法,其它所有语法都是一致的
- 问:为什么 要设计这个语法?
(1) 需求:项目中有部分接口需要的配置与另一部分接口需要的配置不太一样,如何处理
(2)解决:创建2个新axios,每个都有自己特有的配置,分别应用到不同要求的接口请求中
4. 源码分析
4.1. axios与Axios的关系
- 从语法上来说;axios不是Axios的实例
- 从功能上来说:axios是Axios的实例,可以作为函数执行,可以作为对象执行
- axios是Axios.prototype.request函数bind()返回的
- axios作为对象由Axios原型对象上的所有方法,有Axios对象上的所有属性
4.2. instance与axios的区别
- 相同:
- 都是一个能发送任意请求的函数:request(config)
- 都有发特定请求的各种方法:get()/post()/put()/delete()
- 都有默认配置和拦截器的功能:de***ts/interceptors
- 不同:
- 默认匹配值可能不同
- instace没有axios后面添加的一些方法:create()/CancelToken()/all()
4.3 axios的流程图
4.4 axios的流程介绍(串联)
request(config)==>dispatchRequet(config)==>xhrAdaptor(config)
- promise链回调:config
// (unshift)请求拦截器,先添加后执行 =>(fulfilled2,rejected2)->(fulfilled1,rejected1) =>(dispatchRequest,undefined) 发请求 // (push)响应拦截器 =>(fulfilled11,rejected11)->(fulfilled22,rejected22) // axios发请求回调处理(我们自己定义的then) =>(onResolved,onRejected)
request(config)==串联
将请求拦截器/dispatchRequest()/响应拦截器
通过pormise链串联返回promise
dispatchRequet(config)===转换请求,响应数据,调用xhr发请求
转换请求数据=》调用xhrAdaptor(config)发请求=》
请求响应后转换响应数据=》返回promise
xhrAdaptor(config)===成功返回成功或失败promise
创建XHR对象,根据config进行相应设置,发送特定请求,并接受响应数据,返回promise
4.5 axios的请求/响应数据转换器是什么?
1. 请求转换器:对请求头和请求体数据进行特定处理的函数
if (utils.isObject(data)) { setContentTypelfUnset(headers,'application/json;charset=utf-8'); return JSON.stringify(data); }
2. 响应转换器:将响应体json字符串解析为js对象或数组的函数
response.data = JSON.parse(response.data)
4.6 response整体结构
{ data, status, statusText, headers, config, request }
4.7 error的整体结构
{ message, request, response }
4.8.如何取消未完成的请求?
当配置 了cancelToken 对象时
(1) 创建一个用于将来取消请求的cancelPromise
(2) 并定义了一个用于取消请求的cancel函数
(3) 将cancel函数传递出来
调用cancel()取消请求.
(1) 执行cacel函数,传入错误信息message
(2) 内部会让cancelPromise变为成功,且成功的值为一个 Cancel对象
(3) 在cancelPromise的成功回调中中断请求,并让发请求的proimse失败,失败的reason为Cacel对象