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

1.8 axios详解

Axios的定义与核心特性

Axios是一个基于Promise的现代化HTTP客户端库,主要用于在浏览器和Node.js 环境中发送HTTP请求,旨在简化异步数据交互流程。其核心特性如下:

  • 跨平台支持:在浏览器中通过XMLHttpRequest对象发送请求,在Node.js 环境中使用http模块发送请求。
  • Promise API:所有请求均返回Promise对象,支持async/await语法,简化异步代码逻辑。
  • 自动数据转换:默认自动将请求和响应数据转换为JSON格式,也支持自定义转换规则。
  • 拦截器机制:可拦截请求和响应,用于添加认证头、统一错误处理等。
  • 安全性增强:客户端支持防御XSRF(跨站请求伪造),通过在请求中携带Cookie中的令牌验证请求合法性。

Axios的基本使用方法

引入Axios

使用Axios前需先引入其JS文件,可通过本地文件或CDN方式引入。例如本地引入:

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

发送HTTP请求

Axios支持多种请求方式,核心通过axios(config)方法配置请求参数,常用请求方式及示例如下:

  • GET请求:用于获取数据,参数需拼接到URL后。
axios({ method: 'get', url: 'http://example.com/api/employees'  // 可添加参数:url: 'http://example.com/api/employees?id=1'  
}).then(result => { console.log(result.data);  // 响应数据存储在result.data 中 
}); 

  • POST请求:用于提交数据,参数通过data属性传递。
axios({ method: 'post', url: 'http://example.com/api/employees/delete',  data: 'id=1' // 表单格式参数 
}).then(result => { console.log(result.data);  
}); 

核心配置参数

Axios请求配置中常用参数如下:

参数名作用示例
method指定请求方式(默认getmethod: 'post'
url请求地址url: '/api/data'
baseURL基础URL,自动拼接在url前(若url为绝对路径则忽略)baseURL: 'http://example.com'
paramsGET请求参数(自动拼接到URL)params: { id: 1, name: 'test' }
dataPOST请求参数(适用于JSON或表单数据)data: { key: 'value' }
headers自定义请求头headers: { 'Content-Type': 'application/json' }

Axios的高级特性

拦截器

拦截器用于在请求发送前或响应处理前对其进行拦截和修改,分为请求拦截器和响应拦截器:

  • 请求拦截器:可添加认证Token、设置统一请求头。
axios.interceptors.request.use(  config => { config.headers.Authorization  = 'Bearer ' + localStorage.getItem('token');  return config; }, error => Promise.reject(error)  
); 

  • 响应拦截器:可统一处理错误、转换响应数据。
axios.interceptors.response.use(  response => response.data,  // 直接返回响应数据,简化后续处理 error => { if (error.response.status  === 401) { // 处理未授权错误(如跳转登录页) } return Promise.reject(error);  } 
); 

Axios与传统Ajax的对比

特性传统Ajax(XMLHttpRequest)Axios
语法复杂度需手动创建XHR对象,处理回调地狱基于Promise,支持async/await,代码简洁
浏览器兼容性需兼容低版本浏览器(如IE)现代浏览器及Node.js 环境支持,低版本需polyfill
功能完整性需手动处理JSON转换、超时、错误等内置JSON转换、拦截器、取消请求等功能
安全性需手动实现XSRF防御内置XSRF防御机制

Axios作为对传统Ajax的封装,大幅降低了异步请求的开发成本,已成为前端与后端交互的主流工具,尤其在Vue、React等现代框架中被广泛推荐使用

Axios 发送不同类型数据的区别及使用场景

Axios 发送数据时,需根据 数据类型 和 后端接口要求 选择不同的配置方式,核心区别体现在 数据格式Content-Type 请求头 和 传输位置(URL 或请求体)上。以下是常见场景的详细对比:

一、URL 参数(params):拼接在 URL 中

用途
  • 用于 GET 请求传递查询参数(如分页、筛选、排序)。
  • 数据会以 key=value 形式拼接在 URL 末尾(如 https://api.com/data?id=1&name=test)。
配置方式

通过 params 选项传递,Axios 会自动将对象序列化为 URL 查询字符串。

示例
<script>// ... 现有代码(如 axios 基础配置、拦截器)...{{ edit: URL 参数示例 }}// GET 请求传递 URL 参数async function fetchWithParams() {try {const response = await axios.get('/posts', {params: { userId: 1,  // 会自动拼接为 ?userId=1&page=1page: 1 }});console.log('URL 参数请求结果:', response);} catch (error) {console.error('请求失败:', error);}}// 添加触发按钮buttonContainer.innerHTML += `<button onclick="fetchWithParams()">发送带 URL 参数的 GET 请求</button>`;
</script>
关键特点
  • 传输位置:URL query string(可见,有长度限制)。
  • Content-Type:无需设置(GET 请求无请求体)。
  • 数据格式:简单键值对(Axios 自动处理对象序列化)。

二、JSON 数据(请求体):API 接口常用

用途
  • 用于 POST/PUT/PATCH 等请求传递结构化数据(如创建/更新资源)。
  • 后端接口通常要求 Content-Type: application/json
配置方式

通过 data 选项传递 JavaScript 对象,Axios 会自动:

  1. 将对象序列化为 JSON 字符串。
  2. 设置 Content-Type: application/json 请求头。
示例
<script>// ... 现有代码 ...{{ edit: JSON 数据示例 }}// POST 请求发送 JSON 数据async function submitJsonData() {try {const userData = {name: "张三",age: 25,hobbies: ["coding", "reading"]  // 支持嵌套结构};const response = await axios.post('/users', userData);  // 直接传递对象console.log('JSON 数据提交结果:', response);} catch (error) {console.error('请求失败:', error);}}// 添加触发按钮buttonContainer.innerHTML += `<button onclick="submitJsonData()">发送 JSON 数据(POST)</button>`;
</script>
关键特点
  • 传输位置:请求体(Request Body)。
  • Content-Type:自动设置为 application/json
  • 数据格式:支持复杂嵌套对象(Axios 自动 JSON.stringify)。

三、表单数据(application/x-www-form-urlencoded):传统表单提交

用途
  • 模拟 HTML 表单提交(如 form 标签的 method="post")。
  • 后端接口要求 Content-Type: application/x-www-form-urlencoded(数据格式为 key1=value1&key2=value2)。
配置方式

需手动将数据格式化为 URL 编码字符串,常用两种方式:

  1. 使用 URLSearchParams 构造函数(浏览器原生支持)。
  2. 使用 qs.stringify 库(需额外引入,适合复杂对象)。
示例
<script>// ... 现有代码 ...{{ edit: 表单数据(x-www-form-urlencoded)示例 }}// POST 请求发送表单编码数据async function submitFormData() {try {// 方式 1:使用 URLSearchParams(简单键值对)const formData = new URLSearchParams();formData.append('username', 'zhangsan');formData.append('password', '123456');// 方式 2:使用 qs.stringify(需先引入 qs 库,适合嵌套对象)// const qs = require('qs');  // Node.js 环境// const formData = qs.stringify({ username: 'zhangsan', password: '123456' });const response = await axios.post('/login', formData);console.log('表单数据提交结果:', response);} catch (error) {console.error('请求失败:', error);}}// 添加触发按钮buttonContainer.innerHTML += `<button onclick="submitFormData()">发送表单编码数据(POST)</button>`;
</script>
关键特点
  • 传输位置:请求体。
  • Content-Type:Axios 会自动设置为 application/x-www-form-urlencoded(当使用 URLSearchParams 时)。
  • 数据格式:扁平键值对(不支持嵌套对象,需手动处理)。

四、文件/图片上传(multipart/form-data):二进制数据

用途
  • 上传文件(如图片、文档),需使用 multipart/form-data 格式。
  • 数据会被分割为多个 "部分"(part),每个部分包含文件名和二进制内容。
配置方式

通过 FormData 对象构造数据,Axios 会自动:

  1. 设置 Content-Type: multipart/form-data; boundary=xxx(boundary 为自动生成的分隔符)。
  2. 处理二进制文件流。
示例
<body>{{ edit: 添加文件上传输入框 }}<input type="file" id="fileInput" accept="image/*">  <!-- 用于选择图片 --><script>// ... 现有代码 ...{{ edit: 文件上传示例 }}// 上传图片文件async function uploadImage() {try {const fileInput = document.getElementById('fileInput');const file = fileInput.files[0];  // 获取选择的文件if (!file) {alert('请先选择图片');return;}const formData = new FormData();formData.append('image', file);  // 'image' 为后端接收的字段名formData.append('description', '用户头像');  // 可同时传递其他文本字段const response = await axios.post('/upload', formData);console.log('文件上传结果:', response);alert('上传成功,文件 URL:' + response.url);} catch (error) {console.error('上传失败:', error);}}// 添加触发按钮buttonContainer.innerHTML += `<button onclick="uploadImage()">上传图片</button>`;
</script>
</body>
关键特点
  • 传输位置:请求体(二进制流)。
  • Content-Type:自动设置为 multipart/form-data(带分隔符)。
  • 数据格式:支持文件和文本混合传输(通过 FormData.append() 添加)。
http://www.xdnf.cn/news/1234531.html

相关文章:

  • Unix 发展史概览
  • ClickHouse Windows迁移方案与测试
  • 一键安装RabbitMQ脚本
  • 电脑声音标志显示红叉的原因
  • 决策树的实际案例
  • Python-初学openCV——图像预处理(六)
  • Linux网络编程 ---五种IO模型
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各类垃圾的分类检测识别(C#代码UI界面版)
  • 基于MBA与BP神经网络分类模型的特征选择方法研究(Python实现)
  • Java学习第一百部分——Kafka
  • (论文速读)探索多模式大型语言模型的视觉缺陷
  • 关于Web前端安全防御之内容安全策略(CSP)
  • 大语言模型涉及的一些概念(持续更新)
  • Azure DevOps 中的代理
  • 知识点汇集(二)-misc
  • 【数据结构】哈希表实现
  • 数据结构:在链表中插入节点(Inserting in a Linked List)
  • 蛇形卷积介绍
  • AVDTP Media Packet 报文深度解析:蓝牙音频流的幕后功臣
  • Celery-分布式任务队列
  • linux2.6 和 unix-v6 源码实验
  • K8S服务发现原理及开发框架的配合
  • 利用AI渲染技术提升元宇宙用户体验的技术难点有哪些?
  • 语义分割--deeplabV3+
  • Navicat连接远程服务器上的mysql
  • ubuntu24.04安装selenium、chrome、chromedriver
  • elk快速部署、集成、调优
  • [Oracle] TO_DATE()函数
  • 二叉树算法之【前序遍历】
  • GitOps:云原生时代的革命性基础设施管理范式