axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式

axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网

axios的封装

axios封装的重点有三个,一是设置全局config,比如请求的基础路径,超时时间等,第二点是在每次请求前往请求头里面塞token,第三点是处理请求的response,如果出错了进行统一的错误处理

//进行axios二次封装:使用请求与响应拦截器
import axios from 'axios'//第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时的时间)
const request = axios.create({//基础路径baseURL: 'http://localhost:6689', //基础路径timeout: 15000, //超时的时间的设置
})
//第二步:request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {//config配置对象,headers属性请求头,经常给服务器端携带公共参数config.headers.Authorization = 'authorization'//返回配置对象return config
})//第三步:响应拦截器
request.interceptors.response.use((response) => {if (response.headers['content-type'] !== 'application/json') {// 返回的不是json则由调用方处理return response}if (response.data.status == 200) {// 请求成功return response.data} else if (response.data.status == 401) {// 未登录// todo 重新登录return Promise.reject(response.data)} else {// 弹出错误提示console.error(response.data.message)return Promise.reject(response.data)}},(error) => {//失败回调:处理http网络错误的//定义一个变量:存储网络错误信息let message = ''if (error.message.includes('timeout')) {message = '请求接口服务超时'} else if (error.message.includes('Network Error')) {message = '网络错误'}//http状态码if (error.response) {const status = error.response.statusswitch (status) {case 401:message = 'TOKEN过期'breakcase 403:message = '无权访问'breakcase 404:message = '请求地址错误'breakcase 500:message = '服务器出现问题'breakdefault:message = '网络出现问题'break}}if (!message) message = '未知错误'//提示错误信息console.log(message)return Promise.reject(error)},
)//对外暴露
export default request

发送GET请求

我们先来看swagger文档,这个请求是get请求,传递的参数是query,也就是跟在url后面的键值对,类似于?key1=val1&key2=val2这种

 

 实现代码如下,request.js就是上面封装的axios,下面就不重复说了,发送get请求重点是两个,一个是method:get,一个是用params来传递参数

import request from "@/utils/request.js";async function doGet() {const params = {id: 1,name: '研发部'}// 使用params传递query参数const res = await request({url: '/axios/listAll',method: 'get',params //等同于params:params})console.log(res)
}

我们来看下network里面的数据,发送params参数会把请求参数拼接到url后面,如果是中文字符,则进行url编码

发送POST请求,数据类型为json 

看下接口文档,method为post,数据类型为json

 post传递json需要把传递的数据放入请求体(request body)里面,并且把content-type设置成application/json,所幸axios使用起来很简单,只需要把method设置成post,使用data参数传递就行了

async function doPostJson() {const data = {id: 1,name: '研发部'}// json使用data参数传递const res = await request({url: '/axios/add',method: 'post',data //等同于data:data})console.log(res)
}

下图是network中发送的请求头

 

发送的请求体

 

发送POST请求,数据类型为form

post请求,数据类型为form也挺常见的

 方式一,通过query传参,不推荐

第一种方式通过query传参,就是参数跟在url后面,这种方式有两个问题,一是url长度有限制,chrome是8千个字符,post请求一般传递的数据都比较大,二是参数跟在url后面很容易被识别,有一定的安全风险,代码如下:

async function doPostQuery() {const params = {username: 'admin',password: '123456'}// form可以使用params来传参const res = await request({url: '/axios/login',method: 'post',params //等同于params:params})console.log(res)
}

方式二,通过form传参,推荐

 第二种方式是把请求数据放入request body中,可以解决上面两个问题

这种方式需要使用qs库,先安装qs,然后使用data传参,区别就是数据要先通过qs.stringify转换成form

npm install qs
import qs from 'qs'
async function doPostForm() {const data = {username: 'admin',password: '123456'}// 转成form后传参const res = await request({url: '/axios/login',method: 'post',data: qs.stringify(data)})console.log(res)
}

发送PUT请求,数据类型为json

发送put请求跟post是一样的,都是通过data来传递参数,唯一的区别是method改成put就行了

 

async function doPutJson() {const data = {id: 1,name: '研发部'}// json使用data参数传递const res = await request({url: '/axios/update',method: 'put',data //等同于data:data})console.log(res)
}

 

 发送PUT请求,数据类型为form

这个可以参考发送post请求,数据类型为form那段,只要method改成put,其他都一样

 发送DELETE请求,数据类型为path

delete请求是用来做删除的,一般会把id放在请求路径中

async function doDeletePath() {const id = 1// 参数直接拼接在路径后面const res = await request({url: '/axios/delete/' + id,method: 'delete',})console.log(res)
}

 

发送DELETE请求,数据类型为form

 可以通过query的方式传递参数

async function doDeleteForm() {const params = {ids: [1,2,3].join(',')}// 参数直接拼接在路径后面const res = await request({url: '/axios/batchDelete',method: 'delete',params})console.log(res)
}

 

 发送DELETE请求,数据类型为json

method为delete,使用data传递数据

async function doDeleteJson() {const data = {ids: [1,2,3]}// 参数直接拼接在路径后面const res = await request({url: '/axios/batchDeleteJson',method: 'delete',data})console.log(res)
}

 上传文件

axios上传文件的要点是要用FormData对象来组装数据,请求头的Content-Type要设置成multipart/form-data,使用data传递数据表示数据放在request body里面

async function doUpload() {const formData = new FormData();// 把input file里面的文件放入formData,如果后台要求数组,可以多次调用appendformData.append("file", fileRef.value.files[0])// 放入其他数据formData.append("id", 1)formData.append("name", "研发部")// 参数直接拼接在路径后面const res = await request({url: '/axios/uploadFile',method: 'post',data: formData})console.log(res)
}

下载文件 

方式一,window.location.href

如果需要下载的是一个url,则只需要window.location.href=url就行了,但是这种方式有几个问题,一是如果url里面是图片,txt等浏览器可以打开的内容,则会直接打开,不会下载,二是这种方式只支持get请求,如果需要通过post等形式下载则不适用,三是这种方式没法在header里面加token,四是这种方式没法指定文件名,后台指定什么文件名就是什么

方式二,axios下载

axios的下载方式就灵活很多,可以解决上面提到的那些问题,把请求的responseType指定成blob,然后从返回的头字段中解析中文件名,最后通过新建一个看不见的a标签来实现下载

async function doDownload() {// 参数直接拼接在路径后面const res = await request({url: '/axios/downloadFile',method: 'post',responseType: 'blob' // 重要:指定响应类型为blob})downloadFile(res.data, getAttachmentName(res.headers))
}function getAttachmentName(headers) {let fileName = headers['content-disposition']?.match(/filename=(.*)/)[1]if (fileName) {fileName = decodeURI(fileName)} else {//此处表示后台没有设置响应头 content-disposition,请根据业务场景自行处理fileName = "download"}return fileName
}
function downloadFile(file, fileName) {//转成blob对象const blob = new Blob([file], { type: 'application/octet-stream' })if (typeof window.navigator.msSaveBlob !== 'undefined') {window.navigator.msSaveBlob(blob, fileName)} else {// 创建a标签去下载const blobURL = window.URL.createObjectURL(blob)const tempLink = document.createElement('a')tempLink.style.display = 'none'tempLink.href = blobURLtempLink.setAttribute('download', fileName)if (typeof tempLink.download === 'undefined') {tempLink.setAttribute('target', '_blank')}document.body.appendChild(tempLink)tempLink.click()document.body.removeChild(tempLink)window.URL.revokeObjectURL(blobURL)}
}

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

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

相关文章

蓝桥杯单片机学习总结(Day15 超声波测距)

开启超声波模块测距方法: X20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。当CX20106A接收到40KHz的信号时(第五脚200K的电阻决定了其频率为40KHz),会在OUT脚输出一个低电平下降脉冲。这个信号甚至…

Ubuntu-文件管理器中鼠标右键添加文本文件

文件管理器中鼠标右键添加文本文件 一、概述二、步骤 一、概述 Ubuntu在文管右键发现没有创建文本文件的菜单, 期望如下所示,这样的操作非常简单 二、步骤 找到模板文件夹 在模板文件夹,创建自己想要的文件就好啦 这个也是支持放文件夹去…

PyTorch的模型定义方法

文章目录 1、简介2、导包3、设置属性4、构建数据集5、训练函数5.1、初始准备5.2、训练过程5.3、绘制图像 6、运行效果7、完整代码 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长we…

【图形图像-1】SDF

在图形图像处理中,SDF(Signed Distance Field,带符号的距离场)是一种表示图形轮廓和空间距离的数学结构。它通常用于计算机图形学、文本渲染、碰撞检测和物理模拟等领域。 SDF(Signed Distance Field,带符号…

【数据结构】排序算法——Lesson2

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公共祖先】

前言 公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。 二叉树篇继续。 一、【236. 二叉树的最近公共祖先】题目阅读 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q&#xff…

Windows 磁盘分区样式有几种?如何查看电脑分区样式?

在使用 Windows 操作系统的过程中,磁盘分区是一个重要的概念。磁盘分区的方式直接影响到数据存储和系统运行的效率。磁盘分区的时候也有不同的样式,你知道分区类型有哪些吗?不同的分区样式决定了硬盘的分区方式、可支持的最大存储容量以及兼容…

学习笔记:MySQL数据库操作3

1. 创建数据库和表 创建数据库 mydb11_stu 并使用该数据库。创建 student 表,包含字段:学号(主键,唯一),姓名,性别,出生年份,系别,地址。创建 score 表&…

Etsy:以手工制品和复古商品闻名的美国淘宝允许AI艺术品售卖

Etsy是一个美国网络商店平台,以手工艺成品买卖为主要特色,曾被纽约时报拿来和eBay,Amazon比较,被誉为“祖母的地下室收藏”。 Etsy 是一家以手工制品和复古商品闻名的美国网络商店平台在线市场,以手工艺成品买卖为主要…

由“微软蓝屏”事件引发的对网络安全与系统稳定性的思考

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、软件更新流程的漏洞与改进二、强化应急响应机制三、技术创新与应用四、关键行业的特殊应对五、用户意识的提升与数据备份六、全球合作与统一标准总结 前言 …

浅谈断言之XML断言

浅谈断言之XML断言 XML断言是JMeter的一个组件,用于验证请求的响应数据是否符合XML结构。这对于测试返回XML格式数据的Web服务特别有用。 如何添加XML断言? 要在JMeter测试计划中添加XML断言,遵循以下步骤: 打开测试计划&…

The Sandbox:虚拟游戏世界生态系统详解

元宇宙由区块链、软件基础、移动应用、控制台等组成,是一个虚拟空间,结合了增强现实(AR)、虚拟现实(VR)和在线游戏等元素。它强调互操作性,允许用户在不同的虚拟平台之间自由切换。与传统的现实…

病理AI领域的常用开源工具汇总

小罗碎碎念 本期推文主题:病理AI领域的常用开源工具汇总 我们有快一周的时间没见啦,所以,这一期推文带来一些比较有实用价值的资源。 我总结了5个病理AI领域常用的软件,用专用于注释的,也有包含整个处理流程的&#x…

【Linux】UDP 协议

目录 1. UDP 协议2. UDP 协议的特点:3. UDP 协议的格式4. UDP 的缓冲区基于UDP的应用层协议 1. UDP 协议 UDP (User Datagram Protocol) 是一种面向数据报的传输层协议, 是传输层的重要协议之一; UDP协议提供了一种无连接, 不可靠的数据传输服务; 适用于要求源主机以恒定速率…

主控制类,项目小结,实时更新UI

1.用户的信息进行更改,上传请求,服务端进行直接操作数据库,返回请求,客户端根据返回的请求,进行更新界面。 按照我前一篇所说的,写好了主控制类,和第二线程接受服务端的信息,这时候…

【Hot100】LeetCode—416. 分割等和子集

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接:416. 分割等和子集 1- 思路 理解为背包问题 思路: 能否将均分的子集理解为一个背包,比如对于 [1,5,11,5],判断能否凑齐背包为 11 的容量…

leetcode算法题之接雨水

这是一道很经典的题目,问题如下: 题目地址 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 解法1:动态规划 动态规划的核心就是将问题拆分成若干个子问题求解&#…

2024算法、高性能计算与人工智能国际学术会议(AHPCAI 2024)

2024算法、高性能计算与人工智能国际学术会议(AHPCAI 2024) 2024 International Conference on Algorithms, High Performance Computing and Artificial Intelligence 2024年8月14-16日 | 中国-郑州 2024中国算力大会正在发起“算力中国最佳学术论文…

今天我们聊聊C#的并发和并行

并发和并行是现代编程中的两个重要概念,它们可以帮助开发人员创建高效、响应迅速、高性能的应用程序。在C#中,这些概念尤为重要,因为该语言提供了对多线程和异步编程的强大支持。本文将介绍C#中并发和并行编程的关键概念、优点,并…

Langchain核心模块与实战[7]:专业级Prompt工程调教LLM[输入输出接口、提示词模板与例子选择器的协同工程]

Langchain核心模块与实战[7]:专业级Prompt工程调教LLM[输入输出接口、提示词模板与例子选择器的协同工程] 1. 大模型IO接口 任何语言模型应用的核心元素是…模型的输入和输出。LangChain提供了与任何语言模型进行接口交互的基本组件。 提示 prompts : 将模型输入模板化、动态…