python测试开发---前后端交互Axios
Axios 是一个基于 Promise 的 HTTP 客户端,常用于浏览器和 Node.js 中发送 HTTP 请求。它封装了 XMLHttpRequest 和 Node.js 的 http 模块,使得处理网络请求更加简单和直观,尤其适合处理异步请求。以下是 Axios 的基础概念和使用方法:
1. 安装 Axios
在浏览器或 Node.js 环境中使用前,需要先安装 Axios:
- 在浏览器中直接通过
<script>引入:
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
- 在 Node.js 或现代前端开发项目中通过 npm 或 yarn 安装:
npm install axios
2. 基本使用
发送 GET 请求
axios.get('https://www.baidu.com/data').then(response => {console.log(response.data); // 成功处理响应数据}).catch(error => {console.error(error); // 错误处理});
发送 POST 请求
axios.post('https://www.baidu.com/data', {name: 'John',age: 30
}).then(response => {console.log(response.data); // 处理成功的响应}).catch(error => {console.error(error); // 错误处理});
3. Axios 的常见用法
GET 请求(带参数)
axios.get('https://www.baidu.com/users', {params: {id: 123}
}).then(response => console.log(response.data)).catch(error => console.error(error));
params用来将查询参数附加到 URL 中,自动生成类似https://www.baidu.com/users?id=123的 URL。
POST 请求
axios.post('https://www.baidu.com/users', {name: 'Alice',age: 25
}).then(response => console.log(response.data)).catch(error => console.error(error));
- 发送
POST请求时,通常传递 JSON 格式的数据对象。
并发请求
Axios 提供了同时发送多个请求并等待它们全部完成的功能。
axios.all([axios.get('https://www.baidu.com/users'),axios.get('https://www.baidu.com/posts')
]).then(axios.spread((usersResponse, postsResponse) => {console.log(usersResponse.data);console.log(postsResponse.data);}));
axios.all()用于处理多个并发请求,axios.spread()用于分割响应结果。
4. 设置默认配置
可以通过 axios.defaults 设置全局配置,减少每次请求时重复配置。
设置 Base URL
如果你总是向同一个服务器发送请求,可以设置一个 baseURL:
axios.defaults.baseURL = 'https://www.baidu.com/';
axios.get('/users') // 自动将 baseURL 拼接到请求 URL 中.then(response => console.log(response.data));
设置请求头
axios.defaults.headers.common['Authorization'] = 'Bearer TOKEN';
这样所有请求都会带有 Authorization 头。
5. 拦截器
拦截器可以在请求或响应被处理之前拦截并修改它们。
请求拦截器
可以在请求发出前修改请求,比如添加认证 Token。
axios.interceptors.request.use(config => {config.headers.Authorization = 'Bearer TOKEN';return config;
}, error => {return Promise.reject(error);
});
响应拦截器
可以在接收到响应之前对其进行处理,比如检查错误状态码。
axios.interceptors.response.use(response => {return response;
}, error => {if (error.response.status === 401) {console.error('Unauthorized access!');}return Promise.reject(error);
});
6. 取消请求
Axios 支持取消请求,适用于用户撤回操作或重复请求。
const CancelToken = axios.CancelToken;
let cancel;axios.get('https://www.baidu.com/data', {cancelToken: new CancelToken(c => cancel = c)
}).catch(error => {if (axios.isCancel(error)) {console.log('Request canceled', error.message);}});// 调用 cancel 函数可以取消请求
cancel('Operation canceled by the user.');
7. 错误处理
可以通过 .catch() 捕获错误,错误对象包含响应的状态码、请求、消息等信息。
axios.get('https://www.baidu.com/data').catch(error => {if (error.response) {console.log(error.response.status); // 错误状态码console.log(error.response.data); // 错误信息} else if (error.request) {console.log(error.request); // 请求未收到响应} else {console.log('Error', error.message); // 请求发送前出错}});
8. Promise 的使用
Axios 基于 Promise,可以与 async/await 一起使用,简化异步代码。
async function fetchData() {try {const response = await axios.get('https://www.baidu.com/data');console.log(response.data);} catch (error) {console.error(error);}
}fetchData();
9. 配置超时
设置请求超时时间,避免长时间等待无响应。
axios.get('https://www.baidu.com/data', { timeout: 5000 }).then(response => console.log(response.data)).catch(error => console.log('Request timed out', error));
10. 文件上传
Axios 支持通过 FormData 上传文件。
const formData = new FormData();
formData.append('file', fileInput.files[0]);axios.post('https://www.baidu.com/upload', formData, {headers: {'Content-Type': 'multipart/form-data'}
}).then(response => console.log(response.data)).catch(error => console.error(error));
在上一部分中,我们介绍了 Axios 的基本使用方法、请求类型、配置以及一些高级功能(如拦截器、取消请求、错误处理等)。接下来,我们会继续深入介绍一些更高级的 Axios 特性以及在实际项目中的应用技巧。
11. Axios 的实例化
除了全局的 axios 实例外,你可以创建多个自定义的 Axios 实例,配置不同的 baseURL、超时设置、请求头等。这样可以为不同的 API 服务端点提供更灵活的配置。
创建 Axios 实例
const apiClient = axios.create({baseURL: 'https://www.baidu.com',timeout: 10000, // 设置超时时间headers: { 'X-Custom-Header': 'foobar' }
});// 使用这个实例发出请求
apiClient.get('/users').then(response => console.log(response.data)).catch(error => console.error(error));
- 这种方式适合为不同的 API 端点设置不同的配置,避免全局配置的冲突。
- 常用于大型项目中,分别创建针对不同 API 服务的 Axios 实例。
12. 请求重试
有时由于网络抖动或其他临时错误,请求可能会失败。你可以使用 Axios 来实现请求的重试机制,确保在失败后自动重试请求。
手动实现重试机制
可以使用拦截器来捕获请求失败,并手动重试请求。
const apiClient = axios.create({ baseURL: 'https://www.baidu.com', timeout: 5000 });apiClient.interceptors.response.use(null, async (error) => {const config = error.config;if (!config || config.__retryCount >= 3) {return Promise.reject(error);}config.__retryCount = config.__retryCount || 0;config.__retryCount += 1;return new Promise((resolve) => {setTimeout(() => {resolve(apiClient(config)); // 重试请求}, 1000); // 延迟 1 秒后重试});
});apiClient.get('/users').then(response => console.log(response.data)).catch(error => console.error('Failed after retries:', error));
- 每次请求失败后,它会延迟一段时间再尝试重试,最多重试 3 次。
13. 全局错误处理和重定向
在很多情况下,某些错误(例如认证失败、权限不足等)需要进行全局处理,如重定向到登录页面或显示全局错误提示。
全局错误处理
使用 Axios 的拦截器来全局捕获错误,并执行统一的处理逻辑。
axios.interceptors.response.use(response => response,error => {if (error.response.status === 401) {// 处理未授权的情况,如重定向到登录页面window.location = '/login';} else if (error.response.status === 403) {// 处理权限不足的情况alert('You do not have permission to perform this action.');}return Promise.reject(error);}
);
- 这种方法可以确保应用程序中的所有请求错误都得到统一处理,避免在每个请求中重复处理。
14. 取消重复请求
在某些场景下(例如表单提交或数据检索),如果用户在短时间内重复触发相同的请求,最好取消上一次未完成的请求,避免发送不必要的请求和浪费资源。
实现取消重复请求
可以通过 Axios 的 CancelToken 来实现这个功能。
let cancelToken;function fetchData() {if (cancelToken) {cancelToken.cancel('Previous request canceled');}cancelToken = axios.CancelToken.source();axios.get('https://www.baidu.com/data', {cancelToken: cancelToken.token}).then(response => console.log(response.data)).catch(error => {if (axios.isCancel(error)) {console.log('Request canceled:', error.message);} else {console.error(error);}});
}// 用户重复触发请求
fetchData();
fetchData(); // 这会取消上一次请求
- 这种方法可以确保上一次未完成的请求在新请求发出时被取消,节省资源。
15. 设置多种 Content-Type
Axios 可以根据不同的请求类型设置不同的 Content-Type,例如上传文件时需要使用 multipart/form-data,而在发送 JSON 数据时使用 application/json。
根据请求内容设置 Content-Type
// 发送 JSON 数据
axios.post('/json-endpoint', { name: 'John' }, {headers: {'Content-Type': 'application/json'}
});// 上传文件,使用 FormData
const formData = new FormData();
formData.append('file', fileInput.files[0]);axios.post('/upload-endpoint', formData, {headers: {'Content-Type': 'multipart/form-data'}
});
- 根据不同的 API 需求灵活配置请求头,确保服务器能够正确解析请求数据。
16. 上传和下载进度
Axios 支持对文件上传和下载进行进度监听,非常适合上传大文件时给用户反馈当前的上传状态。
上传进度监听
const formData = new FormData();
formData.append('file', fileInput.files[0]);axios.post('/upload', formData, {headers: {'Content-Type': 'multipart/form-data'},onUploadProgress: progressEvent => {const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);console.log(`Upload progress: ${percentCompleted}%`);}
});
下载进度监听
axios.get('/large-file-download', {onDownloadProgress: progressEvent => {const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);console.log(`Download progress: ${percentCompleted}%`);}
});
onUploadProgress和onDownloadProgress提供了一个ProgressEvent对象,可以获取到loaded(已加载字节数)和total(总字节数)来计算完成进度。
17. 高级配置选项
Axios 允许设置一些高级选项来控制请求的行为,如 validateStatus、transformRequest 和 transformResponse。
自定义状态码验证
你可以通过 validateStatus 自定义哪些状态码被认为是成功响应。
axios.get('/api', {validateStatus: function (status) {return status < 500; // 处理 500 以内的状态码为成功}
}).then(response => console.log(response)).catch(error => console.error(error));
请求和响应数据的转换
可以通过 transformRequest 和 transformResponse 在请求发送前或响应接收后对数据进行处理。
axios.post('/api', { name: 'John' }, {transformRequest: [(data, headers) => {// 自定义请求数据的转换逻辑data.name = data.name.toUpperCase();return JSON.stringify(data);}],transformResponse: [(data) => {// 自定义响应数据的转换逻辑data = JSON.parse(data);data.receivedAt = new Date();return data;}]
});
18. 处理跨域请求
如果 Axios 请求的 API 地址与当前应用不在同一个域名下(跨域),需要在服务器上配置 CORS(跨域资源共享)支持。
配置跨域请求
axios.get('https://www.baidu.com/data', {withCredentials: true // 如果 API 需要传递认证信息(如 Cookies)
}).then(response => console.log(response.data)).catch(error => console.error(error));
withCredentials允许跨域请求时携带认证信息,如 Cookies。
相关文章:
python测试开发---前后端交互Axios
Axios 是一个基于 Promise 的 HTTP 客户端,常用于浏览器和 Node.js 中发送 HTTP 请求。它封装了 XMLHttpRequest 和 Node.js 的 http 模块,使得处理网络请求更加简单和直观,尤其适合处理异步请求。以下是 Axios 的基础概念和使用方法…...
删除视频最后几帧 剪切视频
删除视频最后几帧 剪切视频 remove_last.py import subprocess def remove_last_frame(input_file, output_file, frame_rate):command_duration [ffprobe,-v, error,-show_entries, formatduration,-of, defaultnoprint_wrappers1:nokey1,input_file]try:total_duration fl…...
SSM框架学习(四、SpringMVC实战:构建高效表述层框架)
目录 一、SpringMVC简介和体验 1.介绍 2.主要作用 3.核心组件和调用流程理解 4.快速体验 二、SpringMVC接收数据 1.访问路径设置 (1)精准路径匹配 (2)模糊路径匹配 (3)类和方法上添加 RequestMapp…...
戴尔笔记本电脑——重装系统
说明:我的电脑是戴尔G3笔记本电脑。 第一步:按照正常的装系统步骤,配置并进入U盘的PE系统 如果进入PE系统,一部分的硬盘找不到,解决办法:U盘PE系统——出现部分硬盘找不到的解决办法 第二步:磁…...
领夹麦克风哪个品牌音质最好,主播一般用什么麦克风
在这个信息爆炸的时代,清晰的声音传达显得尤为重要。无论是激情澎湃的演讲,还是温馨动人的访谈,一款优质的无线领夹麦克风都能让声音清晰的传播。但市场上产品繁多,如何挑选出性价比高、性能卓越的无线领夹麦克风呢?本…...
华为静态路由(route-static)
静态路由的组成 在华为路由器中,使用ip route-static命令配置静态路由。 一条静态路由主要包含以下要素: 目的地址:数据包要到达的目标IP地址 子网掩码:用于指定目的地址的网络部分和主机部分 下一跳地址(可选&#…...
Focalboard开源项目管理系统本地Windows部署与远程访问协同办公
文章目录 前言1. 使用Docker本地部署Focalboard1.1 在Windows中安装 Docker1.2 使用Docker部署Focalboard 2. 安装Cpolar内网穿透工具3. 实现公网访问Focalboard4. 固定Focalboard公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&am…...
Java如何操作Elasticsearch
目录 前言 Procuct实体类 一、操作索引 二、操作文档 三、查询文档 四、复杂条件查询 五、分页查询 六、结果排序 本文文章介绍的是通过template的方法操作elasticsearch,他的话直接本地注入使用就行,repository方法还需要实现接口,所…...
cpu路、核、线程、主频、缓存
路:主板插口实际插入的 CPU 个数,也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如,一台服务器可能有2路或4路插槽,这意味着它最多可以安装2个或4个物理处理器。 核:单块 CPU 上面能…...
【AI算法岗面试八股面经【超全整理】——深度学习】
AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…...
STL——map和set【map和set的介绍和使用】【multimap和multiset】
目录 map和set1.关联式容器2.键值对3.树形结构的关联式容器3.1set3.1.1set的介绍3.1.2set的使用3.1.2.1set的模版参数列表3.1.2.2set的构造3.1.2.3set的迭代器3.1.2.4set基本接口的使用3.1.2.5set使用案例 3.2map3.2.1map介绍3.2.2map的使用3.2.2.1map的构造3.2.2.2map的迭代器…...
【笔记】神领物流配置本地hosts无法访问域名(排除DNS 排除文件编码问题)已解决
第一次看着文档准备项目 踩坑不少 一遇到问题总是想着先自己解决 其实文档里就有解决方法 看文字总是喜欢跳过 导入虚拟机的时候忘记了给它设置ip地址 按照文档来就好了 配置完之后立刻就可以通过域名访问了 以防万一写一个本地hosts文件的路径在这里 通常来说都是ÿ…...
Java | Leetcode Java题解之第424题替换后的最长重复字符
题目: 题解: public class Solution {public int characterReplacement(String s, int k) {int len s.length();if (len < 2) {return len;}char[] charArray s.toCharArray();int left 0;int right 0;int res 0;int maxCount 0;int[] freq n…...
Xcode 16 Pod init 报错
pod init failed in Xcode 16 Issue #12583 CocoaPods/CocoaPods GitHub 根据你提供的步骤,以下是详细的操作指南来解决 CocoaPods 的问题: ### 步骤 1:在 Xcode 中转换项目文件夹为组 1. 打开你的 Xcode 项目。 2. 在左侧的项目导航器…...
【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)
本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…...
Docker 教程:如何查看容器的最后 300 行实时日志
Docker 教程:如何查看容器的最后 300 行实时日志 文章目录 Docker 教程:如何查看容器的最后 300 行实时日志Docker 日志简介查看容器日志的基本命令查看最后 300 行实时日志的具体命令参数解释 实际案例演示示例输出 常见问题解答如何退出实时日志的查看…...
Qwen2-VL论文阅读笔记
第1章介绍 论文亮点: 1、 the Naive Dynamic Resolution mechanism 2、Multimodal Rotary Position Embedding (M-RoPE) 2D Rotary Position Embedding 3、统一图片和视频的处理范式、增i强视觉感知能力 4、LVLMs的scaling laws:2B、8B、72B 5、 dynamic…...
APScheduler、Django实现定时任务,以及任务动态操作
环境:Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 背景:工作需要使用且用法较为复杂,各种功能基本都使用了 事件:20240920 说明:记录,方便后期自己查找 1、搭建基础环境 文件结构图…...
SpringBoot开发——整合Apache POI轻松生成精美的Excel报表
文章目录 1、准备工作2、编写代码2.1 创建实体类2.2 创建Excel生成服务2.3 创建控制器 3、测试4、结论 在许多企业应用程序中,导出数据到Excel表格是一项常见的需求。Spring Boot提供了许多库来简化这个过程,其中包括Apache POI和Spring Boot的相关模块。…...
海信智能电视的使用心得
买了海信智能电视(型号:32E2F)有一段时间了,要使用这个智能电视还真能考验你的智商。海信电视有很多优点,它的屏幕比较靓丽,色彩好看,遥控器不用对着屏幕就能操作。但也有不少缺点。 1. 海信智能电视会强迫自动更新操作系统&…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
