Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
umi-request 阿里开源的请求库
Fetch提供了一个 JavaScript 接口,也可以发请求和响应。提供了一种简单,合理的方式来跨网络异步获取资源。(所有ie都不支持,一般用于手机端)
Axios特性
- 从浏览器中创建 [XMLHttpRequests]
- 从 node.js 创建 [http]请求
- 支持 [Promise]API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
1.为什么 axios 既可以当函数调用,也可以当对象使用,比如axios({})、axios.get。
- axios本质是函数,赋值了一些别名方法,比如get、post方法,可被调用,最终调用的还是Axios.prototype.request函数。
2.简述 axios 调用流程。
- 实际是调用的Axios.prototype.request方法,最终返回的是promise链式调用,实际请求是在dispatchRequest中派发的。
3.拦截器原理是怎样的?
- 用axios.interceptors.request.use添加请求成功和失败拦截器函数,用axios.interceptors.response.use添加响应成功和失败拦截器函数。在Axios.prototype.request函数组成promise链式调用时,Interceptors.protype.forEach遍历请求和响应拦截器添加到真正发送请求dispatchRequest的两端,从而做到请求前拦截和响应后拦截。拦截器也支持用Interceptors.protype.eject方法移除。
4.axios的取消功能是怎么实现的?
- 通过传递config配置cancelToken的形式,来取消的。判断有传cancelToken,在promise链式调用的dispatchRequest抛出错误,在adapter中request.abort()取消请求,使promise走向rejected,被用户捕获取消信息。
5.为什么支持浏览器中发送请求也支持node发送请求?
- axios.defaults.adapter默认配置中根据环境判断是浏览器还是node环境,使用对应的适配器。适配器支持自定义。