axios

  2022年10月11日,在《AXAJ与JavaScript中的异步编程元素》文章中我总结了对于前端开发者中需要了解和掌握的8种异步编程元素,其中XMLHTTPRequest很关键,它是原生JavaScript提供的用于发送 HTTP 请求的对象,用于在前端与服务器进行数据交互。
  XMLHTTPRequest提供了基本的网络请求功能,但使用起来相对繁琐,需要编写大量的代码来处理不同阶段的请求、响应和错误,即使这些对这些处理做了很好的封装也一样。
  曾经很流行的JQuery中的AXAJ就是对XMLHTTPRequest进行了很好的封装,让开发者能够很方便灵活地使用。

  随着JQuery逐渐淡出,axios在很多前端框架中占据了主流(比如vue+elementUI框架),它也是对XMLHttpRequest(在Node.js 环境中封装的是http模块)进行了很好的封装,提供了一个更为优雅和强大的接口来发送 HTTP 请求。axios基于Promise,允许开发人员以链式调用的方式处理 HTTP 响应的成功和失败情况,从而简化了异步代码的书写和流程控制。

  一、axios的常用方法
  1. 发送 GET 请求:axios.get(url[, config])。
  2. 发送 POST 请求:axios.post(url[, data[, config]])。
  3. 发送 PUT 请求:axios.put(url[, data[, config]])。
  4. 发送 DELETE 请求:axios.delete(url[, config])。
  5. 发送 HEAD 请求:axios.head(url[, config])。
  6. 发送 OPTIONS 请求:axios.options(url[, config])。
  7. 发送 PATCH 请求:axios.patch(url[, data[, config]])。
  axios 提供的各种方法分别对应HTTP规范中定义的不同请求方法,它们各自有不同的用途,通常与 RESTful API 设计标准保持一致,也是为了让axios操作更加语义化。
  对应的后端操作(NodeJS):

constexpress=require('express');
constmyapp=express();myapp.get('/api',(req,res)=>{//处理get请求
});myapp.post('/api',(req,res)=>{//处理post请求
});myapp.put('/api',(req,res)=>{//处理put请求
});myapp.delete('/api',(req,res)=>{//处理delete请求
});myapp.patch('/api',(req,res)=>{//处理patch请求
});myapp.head('/api',(req,res)=>{//处理head请求
});myapp.options('/api',(req,res)=>{//处理OPTIONS请求
});

  在平常的开发中,我们经常使用的是get和post方法,通常是在这两个操作中完成对数据的增、删、改、查。

  二、axios的编码范式

  axios是一个基于Promise的HTTP客户端,在JavaScript代码中使用axios库时,有几种常见的编码范式。
  以axios的get方法为例,下面是常见的用法。
  ⑴基本使用

        axios.get('http://127.0.0.1:1234/user').then(function (res) {console.log(res);}).catch(function (err) {console.error(err);});axios({url:'http://127.0.0.1:1234/user',method:'get'}).then(function (res) {console.log(res);}).catch(function (err) {console.error(err);});

  ⑵带有参数

        axios.get('http://127.0.0.1:1234/user', {params: {ID: 2}}).then(function (res) {console.log(res);}).catch(function (err) {console.error(err);});axios({url:'http://127.0.0.1:1234/user', method:'get',params: { ID: 2 }}).then(function (res) {console.log(res);}).catch(function (err) {console.error(err);});

  ⑶通过async/await使用

        async function getUserInfo() {try {const res = await axios.get('http://127.0.0.1:1234/user?ID=2');console.log(res);} catch (err) {console.error(err);}}getUserInfo();

  ⑷创建axios实例

        const myAxios = axios.create({baseURL: 'http://127.0.0.1:1234',timeout: 2000,});myAxios.get('/user?ID=2').then(function (res) {console.log(res);}).catch(function (err) {console.error(err);});        

  三、axios的链式编程
  很多前端开发者喜欢链式编程写法。
  链式编程中如果任何一个请求发生错误,最后的catch方法都将捕获并统一处理错误,这是方便的地方,但是过多的链式编程给调试带来不必要的麻烦。

        Mock.mock('http://127.0.0.1:1234/user?name=vue',{'user':{'Id':1 }})Mock.mock('http://127.0.0.1:1234/user?userId=1',{'info':{'title':'vue + elementUI + Admin' }})        axios.get('http://127.0.0.1:1234/user?name=vue').then(function (res) {return res.data.user.Id;}).then(function (userId) {return axios.get('http://127.0.0.1:1234/user?userId='+userId);}).then(function (res) {console.log(res.data.info.title);}).catch(function (err) {console.err(err);});

  程序最后输出:vue + elementUI + Admin。

  四、axios处理并发请求

        Mock.mock('http://127.0.0.1:1234/getUserName',{            'name':'vue'             })Mock.mock('http://127.0.0.1:1234/getUserInfo',{'Framework':'vue + elementUI + Admin' })function getUserName() {return axios.get('http://127.0.0.1:1234/getUserName');}function getUserInfo() {return axios.get('http://127.0.0.1:1234/getUserInfo');}Promise.all([getUserName(), getUserInfo()]).then(function (res) {const arr1 = res[0];const arr2 = res[1];// 处理结果console.log(arr1.data.name);console.log(arr2.data.Framework);});axios.all([getUserName(), getUserInfo()]).then(function (res) {const arr1 = res[0];const arr2 = res[1];// 处理结果console.log(arr1.data.name);console.log(arr2.data.Framework);});

  如果不使用axios.all()或者Promise.all()来执行,让两个axios单独执行,那么可能由于axios完成时间的不同,导致不同的axios获取结果存在先后顺序;但是放在axios.all()或者Promise.all()中来执行,那么就是等待这两个都完成再一起输出结果。

  现在流行的写法是使用箭头函数:

        axios.all([getUserName(), getUserInfo()]).then(res=>{console.log(res);for(let i=0;i<res.length;i++){console.log(res[i].data);}});        

  或者:

        axios.all([getUserName(), getUserInfo()]).then(axios.spread((res1,res2) => {console.log(res1.data.name);console.log(res2.data.Framework);}));    

  五、创建axios实例
  一般写法:

        const myAxios=axios.create();myAxios.defaults.baseURL="http://127.0.0.1:1234";myAxios.request({method:'get',url:'/user',timeout: 2000,headers: {'X-Custom-Header': 'foobar'}            }).then(res=>{ console.log(res.data.name); })

  或者:

        const myAxios=axios.create({baseURL:"http://127.0.0.1:1234",timeout: 2000,headers: {'X-Custom-Header': 'foobar'}            });myAxios.request({method:'get',url:'/user',}).then(res=>{ console.log(res.data.name); })

  六、axios拦截器
  拦截操作就是在axios进行操作之前进行一些系统需要统一处理的操作,比如可以验证用户、检查请求的合法性、检查数据的完整性等等。

        Mock.mock('http://127.0.0.1:1234/user',{            'name':'JavaScript'             })const myAxios=axios.create({baseURL:"http://127.0.0.1:1234",timeout: 2000,headers: {'X-Custom-Header': 'foobar'}            });myAxios.interceptors.request.use(request=>{console.log("检查请求...");return request})myAxios.interceptors.response.use(response=>{console.log("检查返回数据...");return response})myAxios.request({method:'get',url:'/user',}).then(res=>{ console.log(res.data.name); })

  上面执行的结果显示如下:

检查请求...
检查返回数据...
JavaScript

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

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

相关文章

「C++ 内存管理篇 0」C和C++对内存的划分

目录 一、C和C对内存的划分 二、小测试 【题目】 【答案】 【解释】 一、C和C对内存的划分 1. 栈区 &#xff1a;存储非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 2. 共享区&#xff1a;用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环&#xff0c;认真贯彻落实国家有关政策&#xff0c;采取多种措施助力汽车产业发展&#xff0c;为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制&#xff0c;我国经济持续稳定…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

网络编程_TCP通信综合练习:

1 //client&#xff1a;&#xff1a; public class Client {public static void main(String[] args) throws IOException {//多次发送数据//创建socket对象,填写服务器的ip以及端口Socket snew Socket("127.0.0.1",10000);//获取输出流OutputStream op s.getOutput…

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1&#xff09; 上世纪50~60年代&#xff0c;计算机刚刚产生 2&#xff09; Machine learning 3&#xff09; Deep learning&#xff0c; 有神经网络&#xff0c; 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

linux 实用技能

1.查看系统版本 cat /etc/redhat-release cat /etc/redhat-release 2. 查看磁盘实用情况 df du 3.查看内存 top -Hp 2214 4. 网络配置 vi /etc/hostname vi /etc/hosts vi /etc/sysconfig/network-scripts/ifcfgens33 6. sed ‘s/a/b/g’ aaa.txt 替换 7. scp …

Eclipse - Colors and Fonts

Eclipse - Colors and Fonts References 编码最好使用等宽字体&#xff0c;Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…

数据分析 — 动画图 pyecharts

目录 一、概念二、安装和导入三、绘图逻辑四、绘图1、柱状图2、折线图3、散点图4、饼图5、南丁格尔图6、Geo() 地理坐标第7、Map() 绘制区域8、词云图9、层叠图10、3D 图11、仪表板 一、概念 Pyecharts 是一个基于 Echarts 的 Python 可视化库&#xff0c;它通过 Python 生成 …

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

ACM/NOI/CSP比赛经验分享

ACM/NOI/CSP比赛经验分享 一、引言 在信息学竞赛的舞台上&#xff0c;ACM/ICPC、NOI和CSP是众多学子梦寐以求的赛事。这些比赛不仅考验了参赛者的算法和数据结构知识&#xff0c;更是对团队协作、时间管理和心理素质的全面挑战。作为一名曾经参与过这些比赛的选手&#xff0c…

最新 Vue3、TypeScript、组合式API、setup语法糖 学习笔记

最新 Vue3、TypeScript、组合式API、setup语法糖 学习笔记 1、创建 Vue3 工程基于 `vue-cli` 创建(基于webpack实现)基于 `vite` 创建(推荐)2、Vue3 项目开发 `vscode` 插件推荐3、`Vue3` 核心语法【optionsAPI】与【CompositionAPI】Options API 的弊端Composition API 的…

洛谷 P8630 [蓝桥杯 2015 国 B] 密文搜索

题目描述 福尔摩斯从 X 星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为 8 的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏…

K8S更新部署docker的两种方法举例

前提条件 imagePullPolicy: Always 方法1&#xff1a;删除更新法 test-project为命名空间 --删除所有asp-svc下面的pod,这会导致从新拉取镜像 kubectl delete pods -l appasp-svc -n test-project --删除指定的pod&#xff0c;这会导致从新拉取镜像 kubectl delete pod …

JSON协议详解、语法及应用

文章目录 一、什么是JSON二、JSON协议结构协议结构包括要素JSON语法规则JSON的协议结构示例 三、JSON的特点四、JSON常见应用场景 一、什么是JSON JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本格式…

MVC 、DDD(domain-driven design,软件主动学习业务)、中台、Java SPI(Service Provider Interface)

文章目录 引言I 单体架构DDD实现版本1.1 核心概念1.2 DDD四层架构规范1.3 案例1.4 请求转发流程II 领域服务调用2.1 菱形对称架构2.2 中台III Java SPI3.1 概念3.2 实现原理3.3 例子:本地SPI找服务see alsojava -cp<

Linux第60步_“buildroot”构建根文件系统第2步_配置“buildroot下的busybox”并测试“buildroot”生成的根文件系统

1、查看“buildroot下的busybox”安装路径 打开终端 输入“ls回车” 输入“cd linux回车/”&#xff0c;切换到到“linux”目录 输入“ls回车”&#xff0c;查看“linux”目录下的文件和文件夹 输入“cd buildroot/回车”&#xff0c;切换到到“buildroot”目录 输入“ls…

MySQL的 4 种连接查询

目录 一、内连接&#xff08;INNER JOIN) 二、外连接&#xff08;LEFT JOIN、RIGHT JOIN 和 FULL JOIN&#xff09; 三、交叉连接&#xff08;CROSS JOIN&#xff09; 四、自连接 在 MySQL 中&#xff0c;常见的连接查询有四种&#xff1a;内连接&#xff08;INNER JOIN&am…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

【Web】CTFSHOW java反序列化刷题记录(部分)

目录 web846 web847 web848 web849 web850 web856 web857 web858 web846 直接拿URLDNS链子打就行 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.lang.reflect.F…

Eclipse - Switch Workspace

Eclipse - Switch Workspace References Switch Workspace References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/