前后端交互系列之Axios详解(包括拦截器)
目录
- 前言
- 一,服务器的搭建
- 二,Axios的基本使用
- 2.1 Axios的介绍及页面配置
- 2.2 如何安装
- 2.3 Axios的前台代码
- 2.4 Axios的基本使用
- 2.5 axios请求响应结果的结构
- 2.6 带参数的axios请求
- 2.7 axios修改默认配置
- 三,axios拦截器
- 3.1 什么是拦截器
- 3.2 拦截器的写法
- 3.3 直接返回data
- 四,优雅写法之async与await
- 五,对response的解构赋值
- 六,后记
前言
Axios是前端最流行的交互工具。所以本节内容将对Axios进行详细讲解。
本节内容需要由Ajax的基础及Promise的基础。这两篇文章可以参考:
前端后端交互系列之原生Ajax的使用
前后端交互系列之promise详解
如果想快速了解axios也可以查看(本篇文章的深度是更高的):
浅析axios原理与使用(包括axios的优雅写法与res的解构赋值)
一,服务器的搭建
我们用nodejs中的express框架来搭建一个服务器。如果想深度学习可以去了解nodejs。本节内容只需要懂得nodejs的基本用法即可。
首先第一步,创建一个写nodejs的文件,并打开该文件的终端:

在终端下载nodejs的包express,下载完毕后左边会出现npm包管理文件:
npm i express

最后书写代码,代码的含义可以不明白,后面套用即可:
const express = require('express')const app = new express();app.listen(8000, () => {console.log('服务器在8000端口运行,地址127.0.0.1')
})
上面这段代码的意思是,引用express包,express包是通过nodejs的http模块封装的。通过express我们可以在自己的电脑上,以自己的电脑创建一台服务器。
在终端运行上述代码,服务器创建成功。

后面我们还需要在代码中加上接口,现在以一个get接口为例子,后面都是这样的形式:
//引入express
const express = require('express')
//创建express的实例对象app
const app = new express();//接口部分,设置路由规则
app.get('/server', (request, response) => {//在后台解决跨域问题response.setHeader('Access-Control-Allow-Origin', '*');//返回值response.send('hello axios')
})
//监听app实例对象,开启服务器
app.listen(8000, () => {console.log('服务器在8000端口运行,地址127.0.0.1')
})
==在修改代码后重新启用代码。==接着我们可以用软件postman发起测试,测试接口,接口测试成功:

以上就是服务器的搭建过程,后面我们可以用类似方式,写接口,用接口。主要是nodejs的一些知识。如果不会可以去了解下或者直接套用。
后面都会给出后台代码,直接套用即可当成普通后台接口去用,影响不大。
二,Axios的基本使用
上面的内容讲解了后台的代码书写及运行。接下来正式进入正题——Axios。
2.1 Axios的介绍及页面配置
Axios是用于前后端交互的一种工具。
其特点:发送Ajax请求、在nodejs中发送http请求、支持promise的相关操作、自动将结果转化为JSON数据、保护数据安全等等。
下面就开始正式学习。
2.2 如何安装
npm引入、CDN、或者文件引入。
项目中往往使用npm引入。学习阶段使用CDN引入。
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
2.3 Axios的前台代码
本节内容主要讲述如何用Axios去发送请求,发送get请求、post请求、put请求以及delete请求。
这是我们的页面结构:

前台代码部分:
<body><h2>axios的基本使用</h2><button class="btn1">get</button><button class="btn2">post</button><button class="btn3">put</button><button class="btn4">delete</button><script>var btn1 = document.querySelector('.btn1')var btn2 = document.querySelector('.btn2')var btn3 = document.querySelector('.btn3')var btn4 = document.querySelector('.btn4')</script>
</body>
2.4 Axios的基本使用
首先要明确的是,请求是由前端发出的。所以我们现在在前端,发送get请求给刚刚已经写好的接口server:

接着,在前端发送get请求,以下也是请求的基本格式:
btn1.addEventListener('click', () => {axios({method: 'GET', url: 'http://127.0.0.1:8000/server'}).then(response => {console.log(response)})})
在上面这段代码里面,method表示的是请求的类型,url是请求的地址,then回调函数是请求后的反馈。以上,是不带参数的请求。
接着是post请求的相关格式,先看后台代码:
//发起post请求
app.post('/post-server', (request, response) => {response.setHeader('Access-Control-Allow-Origin', '*');//返回值const data = {name: '巧克力小猫猿'}response.send(data)
})
接着是前台发送请求:
btn2.addEventListener('click', () => {axios({method: 'POST',url: 'http://127.0.0.1:8000/post-server'}).then(response => {console.log(response)})})
put与delete的格式几乎也与上述一样。
2.5 axios请求响应结果的结构
本节来看axios成功后的返回值的结果。
我们这里来调用刚刚讲的get请求的结果:

然后来介绍结果内部的内容。
config中记录请求类型、请求ur l等内容;
data中放置响应体的内容(对象),(自动JSON解析);
headers中放置请求体;
request中放置和原生xml相关的一些东西;
status中放置响应状态码;
statusText放置响应状态字符串。
2.6 带参数的axios请求
上述介绍了axios的基本使用与返回内容。
现在来了解下如何向服务器发送带参数的axios请求。
我们先来看看发送带参数的get请求:
axios({// 请求方式method: 'GET',// 请求地址url: 'http://www.liulongbin.top:3006/api/getbooks',// url中的查询参数params: {id: 1}}).then(function(res) {console.log(res);})
在以上代码中,用到了params参数,是查询参数,params仅用在发送get请求中。
接着来看看发送post请求:
axios({method: 'POST',url: 'http://www.liulongbin.top:3006/api/post',data: {name: 'zs',age: 20}}).then(function(res) {console.log(res);})
这里用到了data,将数据发送给服务器。data也是仅仅用于在发送post请求中。
2.7 axios修改默认配置
主要用于对url的缩写。
细心的读者应该发现,我们用的url大多都是http://127.0.0.1:8000/xxxx。我们在xxxx上写上对应的信息来访问不同的接口。
所有的url都有http://127.0.0.1:8000这段共同的部分。而本节内容的目的是简化url,所以我们可以把公共部分提取出来,需要时直接使用。
请看如下代码:
//设置基础urlaxios.defaults.baseURL = 'http://127.0.0.1:8000/'btn1.addEventListener('click', () => {axios({method: 'GET', url: '/get-server'}).then(response => {console.log(response)})})
上述代码通过axios.defaults.baseURL设置了基本url,后续则不需要写入基本url,直接加上对应的接口url即可,十分方便。
三,axios拦截器
3.1 什么是拦截器
拦截器是什么: 一些函数,分别有请求拦截器和响应拦截器。
请求拦截器,顾名思义,用作发送请求时,请求被拦截,经过一定处理后才会发送给服务器;
同理,响应拦截器的作用在于,当我们向服务器发送请求,服务器给我们响应过程中,被拦截,响应经过处理后再发送给客户端。
本节内容快就来探索拦截器的作用与原理
3.2 拦截器的写法
我们给拦截器取名为Interceptors。
我们先来学习响应拦截器——对我们的响应进行处理。
这里就需要用到一个api:
axios.interceptors.response.use()
这个api目的就是给请求设置响应拦截,它的格式很像Promise,请看下面代码:
//添加响应拦截器axios.interceptors.response.use(function(response) {console.log('响应拦截器成功')return response}, function(error) {console.log('响应拦截器失败')return Promise.reject(error)})//发送请求var btn1 = document.querySelector('.btn1')axios.defaults.baseURL = 'http://127.0.0.1:8000/'btn1.addEventListener('click', () => {axios({method: 'GET',url: '/get-server'}).then(response => {console.log(response)})})
最后结果:

请求拦截器与响应拦截器的格式非常类似,不同的点在于,请求拦截器第一个参数是我们发送的请求config(这个在文章前面有交代过,config中记录了记录请求类型、请求ur l等内容),而响应拦截器中的第一个参数是response。
下面我们来看请求拦截器的相关代码:
//添加请求拦截器axios.interceptors.request.use(function(config) {console.log('请求拦截器 成功');return config;}, function(error) {console.log('请求拦截器 失败')return Promise.reject(error)})
最后的结果:

这里有一个小细节,如果有多个拦截器,请看下面代码:
//添加请求拦截器1axios.interceptors.request.use(function (config) {console.log('请求拦截器1 成功');return config;}, function (error) {console.log('请求拦截器1 失败')return Promise.reject(error)})//添加请求拦截器2axios.interceptors.request.use(function (config) {console.log('请求拦截器2 成功');return config;}, function (error) {console.log('请求拦截器2 失败')return Promise.reject(error)})//添加响应拦截器1axios.interceptors.response.use(function (response) {console.log('响应拦截器成功1')return response}, function (error) {console.log('响应拦截器失败1')return Promise.reject(error)})//添加响应拦截器2axios.interceptors.response.use(function (response) {console.log('响应拦截器成功2')return response}, function (error) {console.log('响应拦截器失败2')return Promise.reject(error)})
最后的结果:

响应拦截器是按顺序来的,但是请求拦截器是先使用最新的,然后再往后使用。
3.3 直接返回data
大家请看,客户端向服务器发起请求,服务器给予响应,最后响应给客户端的是一个很长的对象:

在这个对象中,有的时候真正有用的仅仅是我们的data。
但是这里的data并不是包含状态码,状态,以及一系列东西的data,而是data里面的这个data,因此我们可以通过拦截器来截取这个data。这就需要用到我们的响应拦截器了:

那么最后的效果:

同时,我们也可以做些判断。后面可以根据需求来进行处理。
四,优雅写法之async与await
在promise的文章中讲过async与await,这里就再次对其进行简单介绍。
promise用来处理异步任务,而axios发送请求就是很典型的异步任务。await可以理解成一种表达式的类型,而async后面接的是一个函数。这两个是专门用来组合,然后写异步任务的。并且,在组合使用的时候,await后面接的是一个异步函数,async函数返回的是一个promise对象。
这里,我们来把axios用async与await进行封装并使用。
先看一下封装前的代码:
<body><button class="btn">发起get请求</button><script>//设置baseurlaxios.defaults.baseURL = 'http://127.0.0.1:8000' //绑定按钮var btn = document.querySelector('.btn');//点击发起axios请求btn.addEventListener('click', () => {axios({methods: 'GET',url: '/get-server',}).then((response) => {console.log(response.data)})})</script>
</body>
现在,我们用async与await对上面的axios进行封装:
<script>//封装axios函数var getserver = async function () {//设置baseurlaxios.defaults.baseURL = 'http://127.0.0.1:8000'const result = await axios({methods: 'GET',url: '/get-server',})console.log(result)return result;}//绑定按钮var btn = document.querySelector('.btn');//点击发起axios请求btn.addEventListener('click', () => {getserver()})</script>
效果:

五,对response的解构赋值
刚刚已经了解,可以用拦截器处理axios的响应值。还有一种方式,可以让获得的值是data,那就是解构赋值。
下面代码是发送一个请求,并对结果解构赋值:
var getserver = async function () {//设置baseurlaxios.defaults.baseURL = 'http://127.0.0.1:8000'const {data: result} = await axios({methods: 'GET',url: '/get-server',})console.log(result)return result;}
上面这段代码,加的内容{data: result}的作用是,把data从result中解析出来,拿出来。所以最后的结果:

六,后记
本篇文章讲述了axios的相关内容。
本系列文章还涉及到ajax,promise,以及跨域问题。欢迎关注!
相关文章:
前后端交互系列之Axios详解(包括拦截器)
目录 前言一,服务器的搭建二,Axios的基本使用2.1 Axios的介绍及页面配置2.2 如何安装2.3 Axios的前台代码2.4 Axios的基本使用2.5 axios请求响应结果的结构2.6 带参数的axios请求2.7 axios修改默认配置 三,axios拦截器3.1 什么是拦截器3.2 拦…...
定时任务之时间轮算法
初识时间轮 我们先来考虑一个简单的情况,目前有三个任务A、B、C,分别需要在3点钟,4点钟和9点钟执行,可以把时间想象成一个钟表。 如上图中所示,我只需要把任务放到它需要被执行的时刻,然后等着时针转到这个…...
实验4 Matplotlib数据可视化
1. 实验目的 ①掌握Matplotlib绘图基础; ②运用Matplotlib,实现数据集的可视化; ③运用Pandas访问csv数据集。 2. 实验内容 ①绘制散点图、直方图和折线图,对数据进行可视化; ②下载波士顿数房价据集,并…...
【软件工程】为什么要选择软件工程专业?
个人主页:【😊个人主页】 文章目录 前言软件工程💻💻💻就业岗位👨💻👨💻👨💻就业前景🛩️🛩️🛩️工作环…...
5类“计算机”专业很吃香,人才缺口巨大,就业前景良好
说到目前最热门的专业,计算机绝对占有一席之地,是公认的发展前景好、人才缺口大的专业。有人称该专业人数如此众多,势必会导致人才饱和,但是从当前社会互联网发展的趋势来看,计算机专业在很长一段时间都是发展很好的专…...
数仓选型对比
1、数仓选型对比如下(先列举表格,后续逐个介绍) 数仓应用目标产品特点适用于 适用数据类型数据处理速度性能拓展 实施难度运维难度性能优化成本传统数仓(SQLServer、Oracle等关系型数据库)面向主题设计的,为 分析数据而设计基于Oracle、 SQLServer、MyS…...
二叉树的遍历(前序、中序、后序)Java详解与代码实现
递归遍历 前序,中序,后序 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, Tree…...
如何找出消耗CPU最多的线程?
如何找出消耗CPU最多的线程? 1.使用 top -c 找出所有当前进程的运行列表 top -c 2.按P(Shiftp)对所有进程按CPU使用率进行排序,找出消耗最高的线程PID 显示Java进程 PID 为 136 的java进程消耗最 3.使用 top -Hp PID,查出里面消…...
【论文笔记】Attention Augmented Convolutional Networks(ICCV 2019 入选文章)
目录 一、摘要 二、介绍 三、相关工作 卷积网络Convolutional networks: 网络中注意力机制Attention mechanisms in networks: 四、方法 1. 图像的自注意力Self-attention over images: 二维位置嵌入Two-dimensional Positional Enco…...
虚幻图文笔记:Character Creator 4角色通过AutoSetup For Unreal Engine插件导入UE5.1的过程笔记
在UE5端安装AutoSetup For Unreal Engine插件 AutoSetup For Unreal Engine是Reallusion官方提供的免费插件,官方下载地址,下载到的是一个可执行文件,点击安装,记住安装的位置⬇ 看装完毕后会打开一个文件夹,这里就是对…...
JAVAWeb04-DOM
1. DOM 1.1 概述 1.1.1 官方文档 地址: https://www.w3school.com.cn/js/js_htmldom.asp 1.1.2 DOM 介绍 DOM 全称是 Document Object Model 文档对象模型就是把文档中的标签,属性,文本,转换成为对象来管理 1.2 HTML DOM(文档…...
C++内存管理基础知识
C 内存管理 C内存管理是一个重要的主题,因为它涉及到程序运行时资源的分配和释放。它可以分为三种类型:静态内存、栈内存和堆内存。 静态内存 静态内存(Static Memory):静态内存用于存储全局变量、静态变量和常量。这…...
命令执行漏洞概述
命令执行漏洞概述 命令执行定义命令执行条件命令执行成因命令执行漏洞带来的危害远程命令执行漏洞相关函数assert()preg_replace()call_user_func() a ( a( a(b)可变函数远程命令执行漏洞的利用系统命令执行漏洞相关函数system()exec()shell_exec()passthru(&#x…...
【初试复试第一】脱产在家二战上岸——上交819考研经验
笔者来自通信考研小马哥23上交819全程班学员 先介绍一下自己,我今年初试426并列第一,加上复试之后总分600,电子系第一。 我本科上交,本科期间虽然没有挂科但是成绩排名处于中下游水平。参加过全国电子设计大赛,虽然拿…...
PTA:C课程设计(7)
山东大学(威海)2022级大一下C习题集(7) 函数题7-6-1 递增的整数序列链表的插入7-6-2 查找学生链表7-6-3 统计专业人数7-6-4 建立学生信息链表 编程题7-7-1 查找书籍7-7-2 找出总分最高的学生 函数题 7-6-1 递增的整数序列链表的插…...
POSTGRESQL LINUX 与 PG有关的内存参释义
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...
Docker的常见命令
前言:使用Docker得学会的几个常见命令 常见命令前置学习: docker --help这个命令必须得会因为,很多命令是记不住的,得使用他们的官方help下面是一些实例 docker load --help常见命令集合: 一: docker images #查看全部镜像 docker rmi #删除某个镜像(例如:docker rmi redis…...
详细介绍性能测试的方法(含文档)
性能测试是软件测试中的一个重要环节,其目的是评估系统在不同负荷下的性能表现,包括响应时间、吞吐量、并发数等指标。通常可以通过以下几种方法进行性能测试: 1、负载测试 负载测试是模拟多用户同时访问系统,测试系统在高并发、…...
深入剖析 Qt QHash :原理、应用与技巧
目录标题 引言QHash 基础用法基础用法示例基础用法综合示例 QHash 的高级用法迭代器:遍历 QHash 中的元素(Iterators: Traversing Elements in QHash )QHash和其他容器的对比QHash 和 std::unordered\_map QHash的底层原理和内存管理QHash 的…...
技术分享 | MySQL级联复制下进行大表的字段扩容
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生开源社区出品,…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
