当前位置: 首页 > news >正文

前后端交互系列之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详解(包括拦截器)

目录 前言一&#xff0c;服务器的搭建二&#xff0c;Axios的基本使用2.1 Axios的介绍及页面配置2.2 如何安装2.3 Axios的前台代码2.4 Axios的基本使用2.5 axios请求响应结果的结构2.6 带参数的axios请求2.7 axios修改默认配置 三&#xff0c;axios拦截器3.1 什么是拦截器3.2 拦…...

定时任务之时间轮算法

初识时间轮 我们先来考虑一个简单的情况&#xff0c;目前有三个任务A、B、C&#xff0c;分别需要在3点钟&#xff0c;4点钟和9点钟执行&#xff0c;可以把时间想象成一个钟表。 如上图中所示&#xff0c;我只需要把任务放到它需要被执行的时刻&#xff0c;然后等着时针转到这个…...

实验4 Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础&#xff1b; ②运用Matplotlib&#xff0c;实现数据集的可视化&#xff1b; ③运用Pandas访问csv数据集。 2. 实验内容 ①绘制散点图、直方图和折线图&#xff0c;对数据进行可视化&#xff1b; ②下载波士顿数房价据集&#xff0c;并…...

【软件工程】为什么要选择软件工程专业?

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言软件工程&#x1f4bb;&#x1f4bb;&#x1f4bb;就业岗位&#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f4bb;就业前景&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️工作环…...

5类“计算机”专业很吃香,人才缺口巨大,就业前景良好

说到目前最热门的专业&#xff0c;计算机绝对占有一席之地&#xff0c;是公认的发展前景好、人才缺口大的专业。有人称该专业人数如此众多&#xff0c;势必会导致人才饱和&#xff0c;但是从当前社会互联网发展的趋势来看&#xff0c;计算机专业在很长一段时间都是发展很好的专…...

数仓选型对比

1、数仓选型对比如下(先列举表格&#xff0c;后续逐个介绍) 数仓应用目标产品特点适用于 适用数据类型数据处理速度性能拓展 实施难度运维难度性能优化成本传统数仓(SQLServer、Oracle等关系型数据库)面向主题设计的&#xff0c;为 分析数据而设计基于Oracle、 SQLServer、MyS…...

二叉树的遍历(前序、中序、后序)Java详解与代码实现

递归遍历 前序&#xff0c;中序&#xff0c;后序 /*** 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最多的线程&#xff1f; 1.使用 top -c 找出所有当前进程的运行列表 top -c 2.按P(Shiftp)对所有进程按CPU使用率进行排序&#xff0c;找出消耗最高的线程PID ​​​ 显示Java进程 PID 为 136 的java进程消耗最 3.使用 top -Hp PID&#xff0c;查出里面消…...

【论文笔记】Attention Augmented Convolutional Networks(ICCV 2019 入选文章)

目录 一、摘要 二、介绍 三、相关工作 卷积网络Convolutional networks&#xff1a; 网络中注意力机制Attention mechanisms in networks&#xff1a; 四、方法 1. 图像的自注意力Self-attention over images&#xff1a; 二维位置嵌入Two-dimensional Positional Enco…...

虚幻图文笔记:Character Creator 4角色通过AutoSetup For Unreal Engine插件导入UE5.1的过程笔记

在UE5端安装AutoSetup For Unreal Engine插件 AutoSetup For Unreal Engine是Reallusion官方提供的免费插件&#xff0c;官方下载地址&#xff0c;下载到的是一个可执行文件&#xff0c;点击安装&#xff0c;记住安装的位置⬇ 看装完毕后会打开一个文件夹&#xff0c;这里就是对…...

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 文档对象模型就是把文档中的标签&#xff0c;属性&#xff0c;文本&#xff0c;转换成为对象来管理 1.2 HTML DOM&#xff08;文档…...

C++内存管理基础知识

C 内存管理 C内存管理是一个重要的主题&#xff0c;因为它涉及到程序运行时资源的分配和释放。它可以分为三种类型&#xff1a;静态内存、栈内存和堆内存。 静态内存 静态内存&#xff08;Static Memory&#xff09;&#xff1a;静态内存用于存储全局变量、静态变量和常量。这…...

命令执行漏洞概述

命令执行漏洞概述 命令执行定义命令执行条件命令执行成因命令执行漏洞带来的危害远程命令执行漏洞相关函数assert()preg_replace()call_user_func() a ( a( a(b)可变函数远程命令执行漏洞的利用系统命令执行漏洞相关函数system()exec()shell_exec()passthru&#xff08;&#x…...

【初试复试第一】脱产在家二战上岸——上交819考研经验

笔者来自通信考研小马哥23上交819全程班学员 先介绍一下自己&#xff0c;我今年初试426并列第一&#xff0c;加上复试之后总分600&#xff0c;电子系第一。 我本科上交&#xff0c;本科期间虽然没有挂科但是成绩排名处于中下游水平。参加过全国电子设计大赛&#xff0c;虽然拿…...

PTA:C课程设计(7)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;7&#xff09; 函数题7-6-1 递增的整数序列链表的插入7-6-2 查找学生链表7-6-3 统计专业人数7-6-4 建立学生信息链表 编程题7-7-1 查找书籍7-7-2 找出总分最高的学生 函数题 7-6-1 递增的整数序列链表的插…...

POSTGRESQL LINUX 与 PG有关的内存参释义

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…...

Docker的常见命令

前言:使用Docker得学会的几个常见命令 常见命令前置学习: docker --help这个命令必须得会因为,很多命令是记不住的,得使用他们的官方help下面是一些实例 docker load --help常见命令集合: 一: docker images #查看全部镜像 docker rmi #删除某个镜像(例如:docker rmi redis…...

详细介绍性能测试的方法(含文档)

性能测试是软件测试中的一个重要环节&#xff0c;其目的是评估系统在不同负荷下的性能表现&#xff0c;包括响应时间、吞吐量、并发数等指标。通常可以通过以下几种方法进行性能测试&#xff1a; 1、负载测试 负载测试是模拟多用户同时访问系统&#xff0c;测试系统在高并发、…...

深入剖析 Qt QHash :原理、应用与技巧

目录标题 引言QHash 基础用法基础用法示例基础用法综合示例 QHash 的高级用法迭代器&#xff1a;遍历 QHash 中的元素&#xff08;Iterators: Traversing Elements in QHash &#xff09;QHash和其他容器的对比QHash 和 std::unordered\_map QHash的底层原理和内存管理QHash 的…...

技术分享 | MySQL级联复制下进行大表的字段扩容

作者&#xff1a;雷文霆 爱可生华东交付服务部 DBA 成员&#xff0c;主要负责Mysql故障处理及相关技术支持。爱好看书&#xff0c;电影。座右铭&#xff0c;每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;…...

开源AI工具降本增效:Pixel Fashion Atelier助力小型工作室节省70%概念图外包成本

开源AI工具降本增效&#xff1a;Pixel Fashion Atelier助力小型工作室节省70%概念图外包成本 1. 项目概述 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的开源图像生成工具&#xff0c;专为时尚设计领域打造。它通过创新的像素风格界面和优化的模型组合&am…...

Kettle(二)资源库配置实战:从创建到高效连接

1. 为什么需要Kettle资源库&#xff1f; 第一次接触Kettle时&#xff0c;我习惯把转换和作业脚本直接保存在本地。直到某天电脑突然蓝屏&#xff0c;辛苦写好的ETL脚本全部丢失&#xff0c;才意识到资源库的重要性。Kettle资源库就像是一个"代码保险箱"&#xff0c;它…...

RWKV7-1.5B-g1a部署教程:supervisorctl status查看服务状态命令详解

RWKV7-1.5B-g1a部署教程&#xff1a;supervisorctl status查看服务状态命令详解 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的多语言文本生成模型&#xff0c;特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时&#xff0c;对硬件要求…...

OpenClaw安全风险全解析:从架构漏洞到应对实践

OpenClaw安全风险全解析:从架构漏洞到应对实践 2026年初,一款名为OpenClaw(俗称“龙虾”)的开源AI智能体风靡全球,上线数月即斩获超20万GitHub星标,成为史上增长最快的开源项目之一。然而,随着大量用户将这一“可真正执行任务的AI”部署于个人电脑和生产环境,一系列触目…...

哈尔滨全屋定制厂家:值得信赖的筛选逻辑深度解析

哈尔滨全屋定制厂家筛选逻辑深度解析&#xff1a;5步找到值得信赖的本地品牌 “哈尔滨全屋定制厂家选择&#xff0c;不是看广告多响&#xff0c;而是这5个筛选逻辑能帮你避开90%的坑”。对于准备在哈尔滨做全屋定制的业主来说&#xff0c;选对厂家直接决定了最终效果与性价比&…...

Chrome WebRTC 实战:构建高可靠实时通信系统的关键技术与避坑指南

最近在做一个需要实时音视频通信的项目&#xff0c;选型时自然想到了 WebRTC。虽然标准很美好&#xff0c;但在 Chrome 浏览器里真正把它用起来、特别是用到生产环境&#xff0c;那真是“坑”出不穷。从 NAT 穿不透导致连不上&#xff0c;到不同设备上视频卡成 PPT&#xff0c;…...

NaViL-9B效果惊艳:复杂背景证件照文字识别+人像属性分析展示

NaViL-9B效果惊艳&#xff1a;复杂背景证件照文字识别人像属性分析展示 1. 模型能力概览 NaViL-9B作为原生多模态大语言模型&#xff0c;在证件照处理领域展现出惊人的能力。它不仅能够准确识别复杂背景下的文字信息&#xff0c;还能对人像属性进行智能分析&#xff0c;为证件…...

ViGEmBus虚拟控制器驱动架构深度解析与高级配置实战指南

ViGEmBus虚拟控制器驱动架构深度解析与高级配置实战指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus作为Windows内核模式虚拟控制器驱动&#x…...

baidupankey:智能解析提取码的百度网盘链接处理解决方案

baidupankey&#xff1a;智能解析提取码的百度网盘链接处理解决方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化资源共享日益普及的今天&#xff0c;百度网盘作为国内领先的云存储服务&#xff0c;其分享链接的提…...

SDMatte提示词(Prompt)高级使用技巧:引导模型优化抠图边缘

SDMatte提示词&#xff08;Prompt&#xff09;高级使用技巧&#xff1a;引导模型优化抠图边缘 1. 为什么提示词对抠图质量至关重要 你可能已经发现&#xff0c;同样的图片在不同提示词下&#xff0c;SDMatte生成的蒙版质量会有明显差异。这就像给修图师不同的工作指令——说&…...