axios 笔记

一、axios 概述、配置

主要功能:

  • 浏览器端发送 AJAX 请求
  • Node.js 支持下发送 HTTP 请求
  • 支持 Promise API
  • 请求和响应拦截
  • 请求和响应的转发
  • 取消请求
  • 客户端防御 XSRF

配置:

<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.27.2/axios.min.js"></script>
npm install axios

二、axios 基本使用

!function Action() {
    axios({
        method: 'xxx',	// 方法类型
        url: 'xxx',
        // 请求体,如果需要的话
        data: {
            a: xxx,
            b: xxx,
        },
    }).then(resp => {
        console.log(resp);
    })
}();

三、axios 其他请求方法

axios.request(config);
axios.post(url, [data], [config]);
...

​ 更多见于官方文档。


四、axios 响应结果结构

{
    config: ...,	// axios 配置
    data: ...,		// 响应数据
    headers: ...,	// 响应头
    request: ...,	// 原生 AJAX 实例
    status: xxx,
    statusText: "xxx",
}

五、axios config 对象

config 对象体常用值如下:

{
    url: 'xxx',
    method: 'xxx',
    baseURL: 'xxx',		// axios 会将它与 URL 自动拼接
    // 下面两个都是做预处理
    transformRequest: [function (data, headers) {
        ...
        return data;
    }],
    transformResponse: [function(data) {
        ...
        return data;
    }],
    headers: {xxx},
    params: {xxx},
    data: {xxx},	// 或这样:data: 'Country=Brasil&City=Belo Horizonte',
    timeout: xxx,
}

六、axios 默认设置

​ 方法:

axios.defaults.method = 'GET';
axios.defaults.baseURL = 'http://localhost:3000';
axios.defaults.params = {id: 300};
axios.defaults.timeout = 3000;

axios({
    url: '/posts',
}).then(resp => {
    console.log(resp);
})

七、axios 创建实例对象发送请求

// 实例化
const obj = axios.create({
    baseURL: 'https://api.apiopen.top',
    timeout: 2000
});
// 调用方法,也可以直接 obj(config),使用与 axios 对象是很类似的
obj.get('/getJoke').then(resp => {
    console.log(resp);
});

​ 注:创建实例对象的好处是,可以给几类不同的请求指定不同的默认配置。而不是使用上面的全局默认配置。


八、拦截器

​ 简单来说,就是函数。可以在请求或响应前拦截进行检测。(也就是实现一些预处理)

// 请求拦截器
axios.interceptors.request.use(config => {
    // 这里的 config 就是 config 对象
    console.log('请求拦截器 成功');
    return config;
}, err => {
    console.log('请求拦截器 失败');
    return Promise.reject(err);
});
// 响应拦截器
axios.interceptors.response.use(resp => {
    console.log('响应拦截器 成功');
    return resp;
}, err => {
    console.log('响应拦截器 失败');
    return Promise.reject(err);
})

// 具体的某个请求
axios.get('https://glowmem.com/api/poet').then(resp => {
    console.log(resp);
}).catch(err => {
    console.warn(err);
})

​ 提示:

  • 请求拦截器可以用于检查并修改配置
  • 响应拦截器可以用于对原生的 axios 响应对象进行过滤
  • 其中任何一个地方抛出错误或出现问题,都会按以下链传递:请求拦截器 -> 响应拦截器 -> 请求的自定义 catch

九、axios 取消请求

​ 一个例子:(发送请求前先进行检查,若有,则取消重发)

var cancel = null;

sendBtn.onclick = function() {
    // 判断是否有未完成请求
    if (cancel !== null) {
        cancel();
    }
    axios({
        method: 'GET',
        url: 'http://localhost:3000/posts',
        // 添加 cancelToken 配置项
        cancelToken: new axios.CancelToken(c => {
        	// 将 c 的值赋给 cancel
            cancel = c;
    	})
    }).then(resp => {
        console.log(resp);
        // 请求完成,重置
        cancel = null;
    })
}

cancelBtn.onclick = function() {
    cancel();
}

十、多个并发请求(弃用)

​ 例子:

function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}

// 参数为所有 axios 请求函数的数组
axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // 两个请求现在都执行完成
  }));

​ 注:现推荐使用 Promise.all() 替代以上方法。

Q.E.D.


f"{言语过于单薄,于此引用心声}"