Axios 是一个基于 Promise 的 HTTP 库,可以用于浏览器和 node.js 环境中。它提供了一个易于使用的 API,可以处理请求和响应,并提供了拦截器、取消请求、自动转换 JSON 数据等功能。Axios 的源码比较庞大,可以从以下几个方面进行分析:
创建 Axios 实例:Axios 构造函数返回一个 Axios 实例,这个实例具有默认配置和拦截器等属性,可以通过 Axios.create 方法创建多个实例。Axios 实例有多个方法,例如:request、get、post、put、delete 等。
// 创建一个 Axios 实例
const instance = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000,
headers: { 'Content-Type': 'application/json' }
});
处理请求和响应:Axios 的核心功能是发送 HTTP 请求和处理响应。Axios 发送请求时,会将请求参数和配置合并成一个请求配置对象,然后使用 XMLHttpRequest 或者 XDomainRequest 发送请求。Axios 接收响应后,会根据响应状态码判断请求是否成功,然后调用拦截器处理响应数据。
// 发送 GET 请求
instance.get('/users', {
params: { id: 1 }
}).then(res => {
console.log(res.data);
}).catch(error => {
console.log(error);
});
实现拦截器:Axios 支持请求拦截器和响应拦截器,可以在请求和响应的各个阶段进行一些自定义操作。拦截器是一个数组,每个元素包含两个回调函数,分别是成功回调和失败回调。
// 添加请求拦截器
instance.interceptors.request.use(config => {
// 在发送请求之前做些什么
config.headers.Authorization = 'Bearer ' + localStorage.getItem('token');
return config;
}, error => {
// 处理请求错误
return Promise.reject(error);
});
// 添加响应拦截器
instance.interceptors.response.use(response => {
// 处理响应数据
return response;
}, error => {
// 处理响应错误
return Promise.reject(error);
});
处理取消请求:Axios 支持取消请求,可以在请求发送前或者请求过程中取消请求。取消请求的实现原理是使用一个 cancelToken 标识请求,然后在需要取消请求的地方调用 cancel 方法。
// 创建一个取消请求的 token
const source = axios.CancelToken.source();
// 发送请求
instance.get('/users', {
cancelToken: source.token
}).then(res => {
console.log(res.data);
}).catch(error => {
console.log(error);
});
// 取消请求
source.cancel('取消请求');