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)}
}
相关文章:

axios请求大全
本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个,一是设置全局config,比如请求的基础路径,超时时间等,第二点是在每次…...

C# 简单的单元测试
文章目录 前言参考文档新建控制台项目新建测试项目添加引用添加测试方法测试结果(有错误)测试结果,通过正规的方法抛出异常 总结 前言 听说复杂的项目最好都要单元测试一下。我这里也试试单元测试这个功能。到时候调试起来也方便。 参考文档 C# 单元测试…...

Linux中Mysql5.7主从架构(一主多从)配置教程
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...

BACnet物联网关BL103:Modbus协议转BACnet/MSTP
随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展,构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下,我们钡铼特别推荐一款主流的BAS(楼宇自动化系统)与BACnet物联网关——BL103&a…...
Go 语言条件变量 Cond
1.Cond 的使用方法 Go 标准库提供 Cond 同步原语的目的是为等待/通知场景下的并发操作提供支持。Cond 通常用于等待某个条件的一组 goroutine,当条件变为 true 时,其中一个或者所有的 goroutine 会被唤醒执行。 Cond 与某个条件相关,这个条件需要一组 goroutine 协作达到。当这…...

PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始
我是从excel中将数据导入,然后再通过sql插入数据,就报错。 需要设置自增ID开始值 1、确定序列名称: 首先,需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id,可以使用以下查询来获取序列名称…...

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示
Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…...
Go语言的数据结构
数据结构 数组 支持多维数组,属于值类型,支持range遍历 例子:随机生成长度为10整数数组 package main import ("fmt""math/rand" ) // 赋值 随机获取100以内的整数 func RandomArrays() {var array [10]int //声明var…...
python_在sqlite中创建表并写入表头
python_在sqlite中创建表并写入表头 import sqlite3def write_title_to_sqlite(tableName,titleList,dataTypeGroupsList,database_path):conn sqlite3.connect(database_path)# 创建游标cursor conn.cursor()#MEMO 长文本#create_table_bodycreate_table_body "序号 …...

1.c#(winform)编程环境安装
目录 安装vs创建应用帮助查看器安装与使用( msdn) 安装vs 安装什么版本看个人心情,或者公司开发需求需要 而本栏全程使用vs2022进行开发c#,着重讲解winform桌面应用开发 使用***.net framework***开发 那先去官网安装企业版的vs…...

图中的最短环
2608. 图中的最短环 现有一个含 n 个顶点的 双向 图,每个顶点按从 0 到 n - 1 标记。图中的边由二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和 vi 之间存在一条边。每对顶点最多通过一条边连接,并且不存在与自身相连的顶…...
安装依赖 npm install idealTree:lib: sill idealTree buildDeps 卡着不动
我一直怀疑是网络问题,因为等了很久也能安装成功,就是时间比较长,直到现在完全受不了了,决定好好整治下这个问题! 1、执行命令 npm config get userconfig 查看配置文件所在位置,将其删除。 2、执行 n…...

LLMs之Llama 3.1:Llama 3.1的简介、安装和使用方法、案例应用之详细攻略
LLMs之Llama 3.1:Llama 3.1的简介、安装和使用方法、案例应用之详细攻略 导读:2024年7月23日,Meta重磅推出Llama 3.1。本篇文章主要提到了Meta推出的Llama 3.1自然语言生成模型。 背景和痛点 >> 过去开源的大型语言模型在能力和性能上一…...
如何实现一个大模型在回答问题时同时提供相关内容链接
通义生成 为了让大模型在回答问题时能够提供相关内容链接,通常采用的方法是结合检索增强生成(Retrieval-Augmented Generation, RAG)的技术。这种方法可以让大模型在生成答案的同时,从外部知识源中检索相关信息,并将这…...

<数据集>玉米地杂草识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:9900张 标注数量(xml文件个数):9900 标注数量(txt文件个数):9900 标注类别数:2 标注类别名称:[Maize, Weed] 序号类别名称图片数框数1Maize8439125142Weed959231048…...
vue3中动态添加form表单校验
<template><div><div v-for"(formData, index) in forms" :key"index"><u-form :model"formData" :rules"rules" ref"formRefs"><u-form-item label"用户名" prop"username"…...

Java面试八股之什么是声明式事务管理,spring怎么实现声明式事务管理?
什么是声明式事务管理,spring怎么实现声明式事务管理? 声明式事务管理是一种编程范式,它允许开发人员通过声明性的配置或注解,而不是硬编码事务处理逻辑,来指定哪些方法或类应该在其上下文中执行事务。这种方法将事务…...
springboot 缓存预热的几种方案
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。 这里我给大家总结几个缓存预热的方案。 方案1:使用启动监听事件实现缓存预热 可以使用 ApplicationListener 监听 ContextRefreshed…...

谷粒商城实战笔记-62-商品服务-API-品牌管理-OSS整合测试
文章目录 一,Java中上传文件到阿里云OSS1,整合阿里云OSS2,测试上传文件 二,Java中整合阿里云OSS服务指南引言准备工作1. 注册阿里云账号2. 获取Access Key3. 添加依赖 实现OSS客户端1. 初始化OSSClient2. 创建Bucket3. 上传文件4.…...
linux c 递归锁的介绍
递归锁的递归特性确实只是对于持有锁的线程。当一个线程获取了递归锁后,它可以多次重复获取该锁,而不会导致自身阻塞或死锁。这是递归锁的重要特点,它允许同一个线程在已经持有锁的情况下,再次获取相同的锁。 然而,对…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...