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.pswp.cn/pingmian/91728.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

41.安卓逆向2-frida hook技术-过firda检测(五)-利用ida分析app的so文件中frida检测函数过检测

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

安卓调javaScript Not find method “forceLogout“ implementatidsignature or namesp

核对一下是否实现对应的javaScript或者javaScript的方法参数对不对&#xff0c; 在这里插入图片描述我这里一开始实现了这个方法但是没有给参数&#xff0c;一直报异常&#xff0c;后台说token没给就查token的问题&#xff0c;最后发现是搞偏了&#xff0c;两个原因&#xff0c…

【Linux网络】:UDP(传输层协议)

目录 一、铺垫知识 1、传输层 2、端口号 2.1、五元组表示 一个进程通信 2.2、端口号范围划分 2.3、知名端口 2.4、查看端口号 2.5、问题 3、pidof & netstat 命令 ①netsate 命令 ②pidof命令 二、UDP协议 1、UDP协议格式 2、UDP报文 1.1、UDP数据封装的过…

Effective C++ 条款19: 设计class犹如设计type

Effective C 条款19&#xff1a;设计class犹如设计type核心思想&#xff1a;设计新的class时&#xff0c;应当像语言设计者设计内置类型一样慎重&#xff0c;考虑对象的创建、销毁、初始化、拷贝、类型转换等所有方面。 ⚠️ 1. 类设计的关键问题域 对象生命周期管理&#xff1…

《汇编语言:基于X86处理器》第11章 MS-Windows编程(3)

本章展示的是如何用32 位Microsoft Windows API进行控制台窗口编程。应用编程接口(API:ApplicationProgramming Interface)是类型、常数和函数的集合体&#xff0c;它提供了一种用计算机代码操作对象的方式。本章将讨论文本I/O、颜色选择、时间与日期、数据文件I/O&#xff0c;…

在 macOS 上通过 Docker 部署DM8 (ARM 架构)

概述 达梦数据库 (DM8) 无法直接在 Apple macOS 操作系统上原生安装&#xff0c;通常需要通过虚拟机&#xff08;如 Parallels Desktop、VMware Fusion&#xff09;进行部署。另一种更轻量级且受 macOS 支持的方案是利用 Docker 容器技术来构建开发与测试环境。本文档将详细介…

网络协议之路由是怎么回事?

写在前面 要想去外面的世界看看, 就离不了路由器&#xff0c;而路由器工作的原理就是路由&#xff0c;那么具体是怎么路由的呢&#xff1f;本文就一起来看下这部分内容。 1&#xff1a;路由的配置 配置一条路由无非就是在配置以下三个信息&#xff1a; 1:包要去哪里&#x…

2106. 摘水果,梳理思路

文章目录题目概要java 解法详解题目概要 在一个无限的 x 坐标轴上&#xff0c;有许多水果分布在其中某些位置。给你一个二维整数数组 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排列…

深入理解消息队列(MQ)核心原理与设计精髓

引言&#xff1a;从一个“不堪重负”的订单系统说起想象一个简化的电商下单流程&#xff1a;用户点击“下单”后&#xff0c;系统需要&#xff1a;在订单数据库中创建一条记录。调用库存服务&#xff0c;扣减商品库存。调用营销服务&#xff0c;给用户发放积分和优惠券。调用通…

前端手撕题总结篇(算法篇——来自Leetcode牛客)

链表指定区域反转 找到区间&#xff08;头和为 for循环当**时&#xff09;->反转链表&#xff08;返回反转过后的头和尾&#xff09;->连接 function reverseBetween( head , m , n ) {//preEnd&cur&nextStart cur.next断开if(mn)return head;const vHeadNode…

从Excel到工时管理系统:企业如何选择更高效的工时记录工具?

还在为手工统计员工工时而头疼吗&#xff1f;月末堆积如山的Excel表格、反复核对的数据、层出不穷的差错&#xff0c;这些问题正在拖慢企业的发展步伐。8Manage工时管理系统发现&#xff0c;传统手工记录不仅耗费大量人力&#xff0c;更让宝贵的工时数据难以转化为有效的管理决…

Java设计模式之《命令模式》

目录 1、介绍 1.1、命令模式定义 1.2、对比 1.3、典型应用场景 2、命令模式的结构 2.1、组成部分&#xff1a; 2.2、整体流程 3、实现 3.1、没有命令模式 3.2、命令模式写法 4、命令模式的优缺点 前言 java设计模式分类&#xff1a; 1、介绍 1.1、命令模式定义 命…

【动态规划算法】路径问题

什么是动态规划算法动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过分解复杂问题为重叠子问题&#xff0c;并存储子问题的解以避免重复计算&#xff0c;从而高效求解具有特定性质&#xff08;重叠子问题、最优子结构&#xff09;问题的算法…

Java基本技术讲解

一、基础语法三要素 暂时无法在飞书文档外展示此内容 &#x1f511; 黄金法则​&#xff1a;每个变量都要声明类型&#xff01;二、程序逻辑控制&#xff08;游戏行为核心&#xff09; 条件判断&#xff1a;if-else - “岔路口选择” // 捡到金币逻辑 if (isTouching(Coin.clas…

【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?

目录 前言:路由器不是只有 “插网线的口” 一、先搞懂一个基础:路由器是 “网络交通枢纽” 二、二层接口:“小区内部的单元门”,只认 “住户身份证” 1. 啥是二层接口? 2. 用 “小区内部串门” 理解二层接口 步骤 1:手机打包数据,写上 “收件人身份证” 步骤 2:二…

MLIR TableGen

简介 TableGen 是一种领域特定语言&#xff08;DSL&#xff09;&#xff0c;TableGen 的设计目标是允许编写灵活的描述&#xff0c;并将记录的通用特性提取出来&#xff0c;从而减少重复代码并提高代码的可维护性。 TableGen的工作流程&#xff1a; 前端解析&#xff1a; Ta…

2、docker容器命令 | 信息查看

1、命令总览命令作用docker ps查看运行中的容器&#xff08;-a查看所有容器&#xff09;docker logs [CONTAINER]查看容器日志&#xff08;-f实时追踪日志&#xff09;docker inspect [CONTAINER]查看容器详细信息&#xff08;JSON格式&#xff09;docker stats [CONTAINER]实时…

【MySQL】MySQL中锁有哪些?

一、按照粒度分类&#xff1a; 粒度越小&#xff0c;并发度越高&#xff0c;锁开销越大。 1.全局锁&#xff1a; 作用&#xff1a; 锁定整个MySQL实例(所有数据库)。适用场景&#xff1a; 全库逻辑部分。(确保备份期间数据的一致性。)实现方式&#xff1a; 通过 FLUSH TABLES W…

语义分割--deeplabV3+

根据论文网络结构图讲一下&#xff1a;网络分为两部分&#xff1a;encoder和decoder部分。 Encoder&#xff1a;DCNN就是主干网络&#xff0c;例如resnet&#xff0c;Xception&#xff0c;MobileNet这些&#xff08;主干网络也要使用空洞卷积&#xff09;&#xff0c;对dcnn的结…

Azure DevOps 中的代理

必知词汇 深入研究 Azure DevOps 中的代理之前需要掌握的基本概念: 代理:Azure DevOps 中的代理是一个软件组件,负责执行流水线中的任务和作业。这可能包括数据中心内的物理服务器、本地或云端托管的虚拟机,甚至是容器化环境。这些代理可以在各种操作系统和环境中运行,例如…