了解一下Axios

375 阅读3分钟

axios是什么?

易用、简洁且高效的http库;

是基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

为什么要用axios

支持node端和浏览器

支持Promise

有丰富的配置项

社区活跃

特性

  1. 在浏览器中使用 XMLHttpRequests
  2. 在node端创建http请求
  1. 支持Promisr API
  2. 拦截请求和相应
  1. 转换请求数据和响应数据
  2. 可以设置取消请求(这个很厉害,取消已经发出的http请求,想象一下什么场景可以用到)
  1. 客户端直至防御XSRF

兼容性

IE8+;

API

get post delete oprions put 方法

请求配置

//下面几个是比较重要的配置
{
	url:'/home',//请求地址
  method:'get',//请求方式
  baseURL:'192.168.0.12',//自动加在url之前
  transformRequest:[function(data,header){ //向服务器发送前,修改请求数据 (特性5)
  	return data
  }],
  transformResponse:[function(data,header){// 既然可以修改请求数据,也可以修改响应数据(特性5)
  	return data
  }],
  headers:{//自定义请求头
    'X-Requested-With': 'XMLHttpRequest'
  },
  timeout:1000,//超时时间
	responseType:"json",//设置响应数据格式
  onUploadProgress:()=>{},//上传进度
  onDownloadProgress:()=>{},//下载进度
  cancelToken:()=>{}//取消请求
}

响应结构

{
  // `data` 由服务器提供的响应
  data: {},

  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,

  // `statusText` 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',

  // `headers` 服务器响应的头
  headers: {},

   // `config` 是为请求提供的配置信息
  config: {},
 // 'request'
  // `request` is the request that generated this response
  // It is the last ClientRequest instance in node.js (in redirects)
  // and an XMLHttpRequest instance the browser
  request: {}
}

拦截器

拦截器可以做些什么呢?

比如请求拦截,可以在拦截器写入公共数据,比如每次与服务端交互都需要token,或者用户ID;这些数据可以在请求拦截中添加,避免重复代码;

响应拦截做什么处理呢?

一般用来做异常处理,比如监控到用户没有登陆,直接跳转登陆页面;监控到其他非正常的code码;弹框或者提示框抛出错误,这样在页面只需要对正常交互的数据进行处理,不需要在处理异常情况了。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

为什么axios可以支持node端和浏览器

看源码:

github.com/axios/axios…

16行到26行,typeof 判断XMLHttpRequest 是否为undefined;如果不是undefined;这判断当前环境为浏览器环境,使用XMLHttpRequest;这就是源码?简单不?简单!!哎呀,我也可以看懂源码了^_。滚~。

那如何使用XMLHttpRequest,adapter有是什么呢?(adapter是适配器,详情请查阅【设计模式】之【适配器模式】)

第20行代码是什么呢?

上代码:

github.com/axios/axios…

下图:看见了没?第21行代码,有没有很熟悉;new XMLHttpRequest

在关注一下第13行代码;这里它返回了一个Promise;Promise呀,所以特性3的出处找到了

关注一下第32行代码;request.open 3个参数,是不是很熟悉

代码再向下翻:

哦~有木有很熟悉onreadystatechange、readyState===4 有木有很熟悉???

onreadystatechange可以看考下面链接

www.w3school.com.cn/ajax/ajax_x…

哎呀,我也可以看懂源码了^_^。滚~。

再下翻一下代码:

关注第150行代码,这是什么?怎么看这像进度条配置呀?哎嘿,它就是进度条配置,XMLHttpRequest实际是已经提供了下载、上传进度的;axios通过监听XMLHttpRequest的progress实现了上传、下载进度的

再关注一下第158行cancelToken;有没有很熟悉,取消请求的配置项;函数直接调用了request.abort();request是什么?request在第21行很清楚是XMLHttpRequest;也就是说XMLHttpRequest支持通过abort取消请求;

特性6找到出处了。

拦截器原理

未完待续~