axios:基本使用、常用配置项、create方法、请求和响应拦截器、取消请求

2023-05-16

axios的使用

  • 一、发送ajax请求
    • 1.axios函数发送通用请求
    • 2.精简版GET请求
    • 3.精简版POST请求
  • 二、配置通用属性(create方法)
  • 三、请求和响应拦截器
    • 1.请求拦截器
    • 2.响应拦截器
  • 四、取消请求
  • 五、axios源码解析

官网:https://github.com/axios/axios

一、发送ajax请求

练习阶段采用链接引入方式:https://www.bootcdn.cn/axios/

1、axios调用的返回值是一个Promise对象,其成功的结果值就是响应值
2、成功的形参叫response,失败的形参叫error
3、axios发送请求成功的值是一个封装好的响应对象:

在这里插入图片描述
我们想要的响应数据其实藏在response.data中。
4、携带query参数时,配置项名字叫params
5、携带params参数没有配置项,只能拼接在url中(所以axios好像更推荐带query)

1.axios函数发送通用请求

注意这里params传的是query参数,只是名字叫params

    ajax.onclick = function() {
    // 通用请求
    axios({
        //请求方法
        method: 'POST',
        //url
        url: 'https://ku.qingnian8.com/dataApi/news/navlist.php',
        //url参数,传的是query类型参数,只是名字叫params
        params: {a:1,b:2},
        //请求头信息(一般用来携带token)
        headers: {token: 'xcv6s8g6875f7sa6f87a6s76'},
        //请求体参数(json编码)
        data: {username: 'zzy',password: '123'},
		//data: `username=zzy&password=123`, //请求体参数(urlencoded编码)
        //超时时间2秒
        timeout:2000
    }).then((response) =>{
        console.log('全部响应结果:',response);
        console.log('响应状态码:', response.status);
        console.log('响应状态字符串:',response.statusText);
        console.log('响应头信息:', response.headers);
        console.log('响应体:', response.data);
    })
}

2.精简版GET请求

写法和DELETE请求(删除)类似,都不用携带请求体参数

get.onclick = function() {
    //GET请求
    axios.get('https://ku.qingnian8.com/dataApi/news/navlist.php',{
        //url参数(query参数)
        params: {a:1,b:2},
        //请求头信息
        headers: {token:'8rwg67v8xv79saf7as098as'},
        //......
    }).then((response) => {
        //请求成功的回调
        console.log('全部响应结果:',response);
        console.log('响应状态码:', response.status);
        console.log('响应状态字符串:',response.statusText);
        console.log('响应头信息:', response.headers);
        console.log('响应体:', response.data);
    })
}

3.精简版POST请求

第二个参数对象里写请求体,第三个参数对象里写url参数和其他信息
写法和PUT请求(更新)类似,都携带请求体参数

   post.addEventListener('click', function() {
        //POST请求
        axios.post('https://ku.qingnian8.com/dataApi/news/navlist.php',{
            //第二个参数对象里写请求体,当然除了对象还有另一种写法,就是写urlencoded
            username: 'zzy',
            password: '123'
        },{
            //url参数(query参数)
            params: {a:1,b:2},
            //请求头信息
            headers: {token:'ger767v79e6f78asd67w5'}
        })
    })

二、配置通用属性(create方法)

我们在一个项目中通常要发送多个请求,那么如果所有的请求都要设置超时时间为2秒,都要设置同样的请求头,难道要每个请求里都写一遍timeoutheaders配置项吗?NO!

这里只需要把公共的配置项,在axios创建前这样写:

axios.defaults.timeout = 2000;
axios.defaults.headers = {token: 'fsdf778s6g8767xcb'};
axios.defaults.baseURL= 'http://localhost:5000';

那么问题来了,如果我在一个项目中要向多个url发送请求,那么其他url也有一个相同的开头,怎么去配置呢?这里就要用到axios.create方法。
1、该方法可以根据指定配置创建一个新的axios,一个新的有自己独特配置的axios
2、新axios和原来的不一样,不过只是没有取消请求批量发送请求的方法,其他都一样
3、存在即合理:有的接口配置和其他接口不一样,比如地址、超时时间等
4、目前的规则是这个要写在上面那defaults代码的前面,否则不生效

const request = axios.create({
	timeout: 6000,
	baseURL: 'https://www.zzy.com'
})

三、请求和响应拦截器

1.请求拦截器

作用:在真正发请求前执行一个回调,做一些事情,比如追加请求头、追加参数、界面加载进度条的提示等等。一般来说只有一个回调

//请求拦截器:在发请求之前,请求拦截器可以检测到,可以在请求发出去之前做一些事情
axios.interceptors.request.use((config) => {
    //config:配置对象,对象里面有一个属性很重要,headers请求头
    console.log('请求拦截器执行', config);
    if(Date.now() % 2 === 0) {
        config.headers.token = 'zzy'; //模拟修改请求头
    }
    nprogress.start(); //进度条开始
    return config;  //检查完再把东西还给人家
});

2.响应拦截器

是得到响应之后执行的一组回调函数,若请求成功,对成功的数据(成功Promise的结果值)进行处理;若请求失败,对失败进行统一的操作。

//3.响应拦截器
axios.interceptors.response.use(
    (res) => {
        console.log('响应拦截器成功的回调执行了,响应对象是:',res);
        //成功的回调函数,服务器响应数据回来以后,响应拦截器可以检测到,可以做一些事情
        nprogress.done(); //进度条结束
        return res.data;//检查完把东西还给人家并加工一下,直接把.data给Promise结果值
    },
    (error) => {
        console.log('响应拦截器失败的回调执行了');
        alert(error);
        //响应失败的回调函数,返回值和then的规则一样
        //若返回非Promise则走成功的回调,返回Promise则根据状态决定
        return Promise.reject(error);
    });

当请求结束后,如果请求成功,就会走第一个回调,然后再走then中成功的回调,所以这里的返回值就是Promise成功的值;如果请求失败,会先走第二个失败的回调,然后根据返回值(非Promise还是Promise)决定是走then中成功的回调还是失败的回调

axios.get('http://www.zzy.com').then(res => {
	console.log('请求成功',res);
}, err => {
	console.log('请求失败', err);
}

一般来说,我们都会省略then的失败回调,所有的错误都在响应拦截器中捕获,做法就是在响应拦截器失败的回调中进行错误提示,并返回一个pending状态的Promise,这样的话我们使用async/await就不用包try-catch了,then也就不用指定失败的回调了。

axios.interceptors.response.use(
    (res) => {
        console.log('响应拦截器成功的回调执行了,响应对象是:',res);
        //成功的回调函数,服务器响应数据回来以后,响应拦截器可以检测到,可以做一些事情
        nprogress.done(); //进度条结束
        return res.data;//检查完把东西还给人家并加工一下,直接把.data给出去
    },
    (error) => {
        console.log('响应拦截器失败的回调执行了');
        alert(error);
        //响应失败的回调函数,返回值和then的规则一样
        //若返回非Promise则走成功的回调,返回Promise则根据状态决定
        return new Promise(()=>{});
    });

......
const reqData = async () => {
	//这样就不用捕获异常了,因为异常都在拦截器中捕获了。
	const result = await axios.get('http://www.zzy.com');
}

四、取消请求

加个cancelToken的这玩意儿就能取消发送中的请求;取消请求后会走失败的回调(或拦截器的失败回调)

let cancel;
发请求的按钮.onclick = () => {
    if(cancel) calcel('取消了'); //用户反复点击,只发送最后一次请求
    axios({
        url: 'www.zzy.com',
        cancelToken: new CancelToken(c => {
            cancel = c;  //c是一个函数,调用c就会取消请求
        })
    }).then(res => {
        console.log('成功',res)
    }, err => {
        if(isCancel(err)) {
            console.log('用户取消了请求',err.message);
        }else {
            console.log('请求失败',err);
        }
        
    });
}

关闭请求的按钮.onclick = () => {
    cancel();
}

取消请求放拦截器里:

let cancel;
axios.interceptors.request.use(config => {
    if(cancel) cancel('取消了');
    config.cancelToken = new CancelToken(c => {
        cancel = c;
    })
    return config;
});

axios.interceptors.response.use(res => {
    return res.data;
}, err => {
    if(isCancel(err)) {
        console.log('用户取消了请求,原因是',err.message);
    } else {
        console.log('请求失败',err);
    }
    return new Promise(() => {});
})

发请求的按钮.onclick = async() => {
    let result = await axios.get('www.zzy.com');
    console.log(result);
}

五、axios源码解析

有点小小的复杂,先不研究了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

axios:基本使用、常用配置项、create方法、请求和响应拦截器、取消请求 的相关文章

随机推荐

  • nohup: failed to run command `python3‘: No such file or directory

    nohup failed to run command 96 python3 No such file or directory 我的 python 是用别名设置的 xff0c 可以直接使用 xff0c 但是加上 nohup 就会报错 xf
  • Wxpython控件自适应窗口大小GridBagSizer

    使用wx GridBagSizer 使控件能随着用户缩放窗口大小而自动调整 xff0c wx GridBagSizer 把空间用横线和竖线划分成一个个格子 xff0c 用控价填充这些格子 xff0c 从而自由的控制布局 原来的布局代码 xf
  • 随笔:MybatisPlus代码生成器(新)

    Mybatis Plus 官网 xff1a https baomidou com 代码生成器 新 xff1a https baomidou com pages 779a6e 适用版本 xff1a mybatis plus generator
  • 出现insmod: can't insert 'kernel_hello.ko': invalid module format解决方法

    出现insmod can 39 t insert 39 kernel hello ko 39 invalid module format解决方法 xff1a 问题 xff1a gt ls info proc tmp apps init ro
  • 手撕Buck!Buck公式推导过程

    这个文章我本来没打算写的 xff0c 因为之前我已经写了 手撕Boost xff01 Boost公式推导及实验验证 xff0c 在我看来 xff0c Buck与boost是完全类似的 xff0c 明白一个 xff0c 另外一个也就明白了 不
  • centos8, 未找到匹配的参数: iftop 错误:没有任何匹配: iftop

    yum install iftop y 上次元数据过期检查 xff1a 0 00 51 前 xff0c 执行于 2023年04月25日 星期二 01时29分12秒 未找到匹配的参数 xff1a iftop 错误 xff1a 没有任何匹配 i
  • 写论文时如何翻译外文文献?

    搞科研就是集所有既有成果为大成者 想要论文写得好 xff0c 一定要有丰富的知识储备和对该领域专业技能的熟练掌握 xff0c 这其中不可能少的了外文文献的知识储备 外文文献的阅读十分重要 那么阅读的前提是什么呢 xff1f 翻译 xff01
  • Hive的计算引擎,你知道哪几种?

    作为大数据开发工程师来说 xff0c Hive数据库的开发还是比较重要的 xff0c 所以我们需要知道hive数据库的计算引擎有哪些 xff0c 这样在做hive调优的时候 xff0c 也是有一定的辅助作用 大家enjoy Hive支持Ma
  • C++头文件的作用

    C 43 43 编译模式 通常 xff0c 在一个C 43 43 程序中 xff0c 只包含两类文件 cpp文件和 h文件 其中 xff0c cpp文件被称作C 43 43 源文件 xff0c 里面放的都是C 43 43 的源代码 xff1
  • cephadm部署ceph集群

    使用 cephadm 安装 Ceph 集群 centos7 4三台 Ceph octopus 15 2 3 Python 3 6 Docker 默认最新的 注意 xff1a OSD 硬盘需要大于 5G 官方文档 xff1a https do
  • 图像处理算法其实都很简单

    要学习高斯模糊我们首先要知道一些基本概念 xff1a 线性滤波与卷积的基本概念 线性滤波可以说是图像处理最基本的方法 xff0c 它可以允许我们对图像进行处理 xff0c 产生很多不同的效果 做法很简单 首先 xff0c 我们有一个二维的滤
  • 使用C语言实现冒泡排序算法

    冒泡排序 冒泡排序属于交换排序的一种 所谓交换 xff0c 就是根据序列中两个关键字的比较结果来确定这两个记录在序列中的位置 冒泡排序的基本思想 xff1a 假设一个待排序列长度为n xff0c 从后往前 xff08 或从前往后 xff09
  • PAT1002 写出这个数

    1002 写出这个数 xff08 20 分 读入一个正整数 n xff0c 计算其各位数字之和 xff0c 用汉语拼音写出和的每一位数字 输入格式 xff1a 每个测试输入包含 1 个测试用例 xff0c 即给出自然数 n 的值 这里保证
  • PAT1010 一元多项式求导

    一元多项式求导 设计函数求一元多项式的导数 xff08 注 xff1a x n xff08 n为整数 xff09 的一阶导数为nx n 1 xff09 输入格式 以指数递降方式输入多项式非零项系数和指数 xff08 绝对值均为不超过 100
  • Property "属性名" not found on object of type "类名"

    这个问题其实应该很少人会遇到的 xff0c 昨天一个朋友刚进新公司 xff0c 拉下代码就是这个错误 让我帮忙看一下 然后点进去看一下是这样的 xff1a command 点进这个属性 xff0c 发现这个属性确实在 xff1a 我知道可能
  • PT1016 部分A+B

    正整数 A 的 D A xff08 为 1 位整数 xff09 部分 定义为由 A 中所有 DA组成的新整数 P A 例如 xff1a 给定 A 61 3862767 xff0c DA 61 6 xff0c 则 A 的 6 部分 P A是
  • PAT1017 A除以B

    A除以B 本题要求计算 A B xff0c 其中 A 是不超过 1000 位的正整数 xff0c B 是 1 位正整数 你需要输出商数 Q 和余数 R xff0c 使得 A 61 B Q 43 R 成立 输入格式 xff1a 输入在一行中依
  • PAT1018 锤子剪刀布

    锤子剪刀布 大家应该都会玩 锤子剪刀布 的游戏 xff1a 两人同时给出手势 xff0c 胜负规则如图所示 xff1a FigCJB jpg 现给出两人的交锋记录 xff0c 请统计双方的胜 平 负次数 xff0c 并且给出双方分别出什么手
  • 理清一下VS工程中的“包含目录” “库目录” “依赖”

    理清一下VS工程中的 包含目录 库目录 依赖 VS调用开源库的配置方法VS中工程的 依赖 xff0c 库目录 xff0c 包含目录 包含目录 库目录 附加包含目录 附加库目录 附加依赖项之详解 1 开源库经过编译后一般产生三种VS能够用到的
  • axios:基本使用、常用配置项、create方法、请求和响应拦截器、取消请求

    axios的使用 一 发送ajax请求1 axios函数发送通用请求2 精简版GET请求3 精简版POST请求 二 配置通用属性 xff08 create方法 xff09 三 请求和响应拦截器1 请求拦截器2 响应拦截器 四 取消请求五 a