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

news2024/11/27 2:49:50

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源码解析

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub桌面版和汉化包,使用详细(GitHub Desktop安装,github软件汉化包详细使用过程)

github大家都比较熟悉,而它的桌面版使用则更加方便(GitHub桌面版就是GitHub Desktop,它们的数据都是相通的),但是软件是英文版本,使用起来不太方便,这里为大家提供了该软件和汉化包,…

记一次靶场实战【网络安全】

前言 【一一帮助安全学习一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 ④50份安全攻防面试指南 ⑤安全红队渗透工具包 ⑥网络安全必备书籍 ⑦100个漏洞实战案例 ⑧安全大厂内部视频资源 ⑨历年CTF夺旗赛题解析 一、信息收集 先用nmap扫一下ip。 锁定…

多元线性回归分析

回归分析:研究X和Y之间相关性的分析回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的任务就是,通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成…

gumbel-softmax的使用、课程学习的使用、有监督的对比学习的使用、无监督的对比学习的使用

一、gumbel-softmax的使用 gumbel-softmax里面的 τ\tauτ值越接近无穷获得的向量越接近一个均匀分布的向量;τ\tauτ值越接近0获得的向量越接近一个one-hard vector;τ\tauτ值越接近1则gumbel-softmax就和softmax越类似 # score:代表序列…

Ubuntu服务器使用NTP功能同步时间

前提: 1. 要明确自己的需求,是设计一个NTP服务器,然后给内网的其他用户提供NTP服务? 2. 还是发现自己Ubuntu系统时间错误,想要同步一个时间进来? 如果是2,继续往下看吧,如果是1&am…

2021年一篇强人工智能论文,基于AGI Brain改进的二代版本

AGI Brain II: The Upgraded Version with Increased Versatility Index返回论文和资料目录 1.论文简介 论文基于19年提出的第一代AGI Brain I 改进。主要有两点改进,1.提出一个AGI指标,2.用Mamdani模糊推理联想记忆代替原本的神经网络NN表示外显记忆&…

字节跳动最爱考的前端面试题:计算机网络基础

注意:每道题前面出现的 (xx) 数字代表这道题出现的频次,此 计算机网络 基础是基于 30 篇前端面经整理出的问题和对应的回答、参考链接等。文章内容为拿到 Offer 的本人整理。 (3)问:HTTP 缓存 HTTP 缓存又分为强缓存和…

ArcGIS基础实验操作100例--实验55栅格与ASCII转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验55 栅格与ASCII转换 目录 一、实验背景 二、实验数据 三、实验步骤 (1&a…

nodejs+vue+element+eachers构建开源项目大型连续剧(3)建立前端基础项目(暂时用的vue2框架)

书接上回,在第二集我们成功安装了mysql数据库,并通过nodejs服务器关联到数据库,并成功更改了数据库中的数据。这一集呢,主要是进行一个前端vue2项目的构建,后面如果大家想要看vue3的话可以后续更新,毕竟现在…

计算机原理二_操作系统概述

目录儿三、操作系统概述3.1 操作系统的基本概念3.1.1 操作系统的概念3.1.2 操作系统的目标和功能3.1.2.1 目标3.1.2.2 功能3.1.3 操作系统的特征3.2 操作系统的发展与分类3.2.1 分类3.3 操作系统的运行环境3.3.1 操作系统的运行机制3.3.1.1 用户态、核心态3.3.1.2 时钟与中断3.…

SLAM初探

SLAM初探 1.视觉SLAM框架 整个视觉SLAM包括以下流程 传感器信息读取,主要是相机图像信息的读取和处理前端视觉里程计,它的任务是估算相邻图像之间相机的运动和局部的地图后端优化,接受不同时刻视觉里程计输出的相机位姿以及回环检测的信息&…

【C++高阶数据结构】LRU

​ 🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏…

LeetCode刷题复盘笔记—一文搞懂动态规划之583. 两个字符串的删除操作问题(动态规划系列第四十篇)

今日主要总结一下动态规划的一道题目,583. 两个字符串的删除操作 题目:583. 两个字符串的删除操作 Leetcode题目地址 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意…

ArcGIS基础实验操作100例--实验56 TIFF与GRID栅格转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验56 TIFF与GRID栅格转换 目录 一、实验背景 二、实验数据 三、实验步骤 (…

orika 工具下划线转驼峰不同字段名映射

1.问题: 业务需要把第三方接口的带下划线的字段规范为驼峰的字段 第三方接口的bean对象: public class ObjectsDetail extends XMLElementData implements Serializable {private static final long serialVersionUID 5080447582610246168L;private String objectclass;priv…

用300行Python代码实现一个人脸识别系统源码,基于dlib

用300行Python代码实现一个人脸识别系统 完整代码下载地址:用300行Python代码实现一个人脸识别系统源码,基于dlib 今天我们来python实现一个人脸识别系统,主要是借助了dlib这个库,相当于我们直接调用现成的库来进行人脸识别&…

科技云报道:“大建设”时期,AI算力何去何从?

科技云报道原创。 算力就是生产力,得算力者得天下。 随着新一代人工智能技术的快速发展和突破,以深度学习计算模式为主的AI算力需求呈指数级增长。 数据显示,在1960到2010年间,AI的计算复杂度每两年翻一番;在2010到2…

fastposter v2.11.0 天花板级的海报生成器

fastposter v2.11.0 天花板级的海报生成器 🔥🔥🔥 fastposter海报生成器是一款快速开发海报的工具。只需上传一张背景图,在对应的位置放上组件(文字、图片、二维🐴、头像)即可生成海报。 点击代…

实验二十一 配置NAT

实验二十一 配置NAT实验要求: 静态NAT: 在Router的公网侧接口GE0/0/1下配置静态NAT,将私有 IP地址 192.168.0.2与公有IP地址202.10.1.3绑定起来。 NAT SERVER的配置 动态NAT和easy IP的配置网络拓扑图:操作步骤:一、静态NAT1、配置…