当前位置: 首页 > 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.lryc.cn/news/608666.html

相关文章:

  • Axios介绍
  • 超声波泄露传感器
  • SpringBoot3.x入门到精通系列:2.6 整合 Redis 详解
  • Python 基础语法(一):从常量到运算符
  • jvm之jconsole的使用
  • MySQL连接算法和小表驱动大表的原理
  • 初识prometheus
  • Selenium Web 自动化
  • 【软考中级网络工程师】知识点之 RIP 协议
  • 华为智能家居与Spring人工智能
  • 决策树学习全解析:从理论到实战
  • C++手撕基于ID3算法的决策树
  • 著作权登记遇难题:创作者如何突破确权困境?
  • 自动驾驶中的传感器技术19——Camera(10)
  • ELECTRICAL靶场
  • ClickHouse Windows迁移方案与测试
  • 【动态规划算法】路径问题
  • WebRTC前处理模块技术详解:音频3A处理与视频优化实践
  • Node.js (Express) + MySQL + Redis构建项目流程
  • 决策树的实际案例
  • sqli-labs:Less-25关卡详细解析
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | TodoList(代办事项组件)
  • 子区间问题
  • 主机序列号的修改方法与原理
  • Azure DevOps 中的代理
  • 渗透作业4
  • LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
  • webrtc弱网-QualityScaler 源码分析与算法原理
  • PLC传感器接线与输出信号接线
  • WSUS服务器数据库维护与性能优化技术白皮书