《AJAX:前端异步交互的魔法指南》

 

什么是AJAX

AJAX(Asynchronous JavaScript and XML,异步 JavaScript 和 XML) 是一种用于创建异步网页应用的技术,允许网页在不重新加载整个页面的情况下,与服务器交换数据并局部更新页面内容。尽管名称中包含 XML,但现代 AJAX 主要使用 JSON(JavaScript Object Notation)作为数据格式。


核心原理

  1. 异步通信

    • 浏览器通过 JavaScript 异步发送请求到服务器,同时用户可继续操作页面。

    • 服务器返回数据后,JavaScript 动态更新页面指定部分,无需刷新整个页面。

  2. 基于 XMLHttpRequest 或 Fetch API

    • 传统 AJAX 使用 XMLHttpRequest 对象发起请求。

    • 现代开发中更常用 Fetch API(基于 Promise,语法更简洁)。


工作流程

sequenceDiagramparticipant 用户participant 浏览器participant 服务器用户->>浏览器: 触发事件(点击、滚动等)浏览器->>服务器: 发送异步请求(XHR/Fetch)服务器->>浏览器: 返回数据(JSON/XML/HTML)浏览器->>用户: 局部更新页面内容

关键特点

特性说明
异步性不阻塞用户操作,后台完成数据交互。
无刷新更新仅更新页面局部内容,避免整页重载。
数据格式灵活支持 JSON、XML、HTML 或纯文本。
依赖 JavaScript需浏览器启用 JavaScript。
跨域限制默认受同源策略限制,需通过 CORS(跨域资源共享)或代理解决跨域问题。

  • 使用浏览器的 XMLHttpRequest 对象 与服务器通信

  • 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端拿到数据数组以后,展示到网页。

什么是axios

 

Axios 是一个基于 Promise 的现代化 HTTP 客户端库,专为浏览器和 Node.js 设计,用于简化前端与后端的数据交互。它封装了底层 HTTP 请求细节,提供了更简洁、易用的 API,并支持拦截器、自动 JSON 转换、请求取消等高级功能,是替代原生 XMLHttpRequest 和 Fetch API 的流行选择。


核心特性

特性说明
基于 Promise天然支持异步编程,避免回调地狱,可使用 async/await 简化代码。
浏览器 & Node.js 支持同一套代码兼容浏览器(XHR)和 Node.js(HTTP 模块)。
自动 JSON 转换自动将请求/响应数据与 JSON 格式互相转换。
拦截器机制可全局拦截请求和响应,用于添加身份验证、日志、错误处理等统一逻辑。
取消请求支持主动取消未完成的请求(如用户离开页面时终止无用请求)。
并发请求通过 axios.all() 和 axios.spread() 处理多个并行请求。
客户端防御 XSRF支持自动添加 XSRF Token 到请求头,增强安全性。
超时控制可设置请求超时时间,避免长时间等待无响应。

基础用法示例

1. 发起 GET 请求

 

import axios from 'axios';// 基本 GET 请求
axios.get('https://api.example.com/data').then(response => {console.log(response.data); // 响应数据}).catch(error => {console.error('请求失败:', error);});// 带参数的 GET 请求
axios.get('https://api.example.com/user', {params: {id: 123,type: 'vip'}
});

2. 发起 POST 请求

 

axios.post('https://api.example.com/login', {username: 'admin',password: '123456'
})
.then(response => {console.log('登录成功:', response.data.token);
});

3. 并发请求

 

const getUser = axios.get('/user/123');
const getPosts = axios.get('/posts');axios.all([getUser, getPosts]).then(axios.spread((userRes, postsRes) => {console.log('用户数据:', userRes.data);console.log('帖子数据:', postsRes.data);}));

4. 全局配置

 

// 设置全局默认值(如 API 基础路径)
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = 'Bearer token123';
axios.defaults.timeout = 5000; // 5秒超时

高级功能

1. 拦截器(Interceptors)

 

// 添加请求拦截器(如添加 Token)
axios.interceptors.request.use(config => {config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;return config;
}, error => {return Promise.reject(error);
});// 添加响应拦截器(如统一处理错误)
axios.interceptors.response.use(response => {return response.data; // 直接返回数据部分
}, error => {if (error.response.status === 401) {alert('登录已过期,请重新登录!');window.location.href = '/login';}return Promise.reject(error);
});

2. 取消请求

 

const source = axios.CancelToken.source();axios.get('/data', {cancelToken: source.token
}).catch(error => {if (axios.isCancel(error)) {console.log('请求被取消:', error.message);}
});// 取消请求(参数为可选提示信息)
source.cancel('用户主动取消操作');

Axios vs Fetch API

对比项AxiosFetch API
语法简洁性封装度高,API 更简洁原生 API,需手动处理更多细节
JSON 转换自动转换请求/响应数据需手动调用 response.json()
拦截器支持全局请求/响应拦截无内置拦截器,需自行封装
取消请求内置支持通过 AbortController 实现
浏览器兼容性兼容 IE11+(需 polyfill)兼容现代浏览器,IE 不支持
超时控制直接通过 timeout 配置需结合 setTimeout 和 AbortController

常见问题解决

  1. 跨域请求(CORS)

    • 需后端配置 Access-Control-Allow-Origin 等响应头。

    • 开发环境可通过代理(如 Webpack DevServer 代理)绕过。

  2. 文件上传

    const formData = new FormData();
    formData.append('file', fileInput.files[0]);axios.post('/upload', formData, {headers: { 'Content-Type': 'multipart/form-data' }
    });

     

  3. 错误处理统一封装
    建议通过拦截器集中处理 HTTP 状态码和业务错误码。

什么是URL

URL(Uniform Resource Locator,统一资源定位符) 是用于标识和定位互联网上资源(如网页、图片、视频等)的字符串。它是 Web 的核心组成部分,用户通过 URL 访问特定资源,浏览器通过 URL 向服务器请求数据。


URL 的结构

一个完整的 URL 通常由以下部分组成:

 

协议://主机名:端口号/路径?查询参数#片段标识符

示例

 

https://www.example.com:443/path/to/resource?name=value#section1

 


    URL 的组成部分详解

    部分说明
    协议(Scheme)指定访问资源使用的协议,常见的有:
    http:超文本传输协议
    https:加密的 HTTP
    ftp:文件传输协议
    mailto:电子邮件地址
    主机名(Host)资源所在服务器的域名或 IP 地址,如 www.example.com
    端口号(Port)服务器监听的端口号,默认端口可省略(如 HTTP 默认 80,HTTPS 默认 443)。
    路径(Path)资源在服务器上的具体位置,如 /path/to/resource
    查询参数(Query)以 ? 开头,包含键值对,用于传递额外信息,如 ?name=value&age=25
    片段标识符(Fragment)以 # 开头,指向资源内部的特定部分(如 HTML 页面的锚点)。

     URL里的查询参数

    什么是查询参数 ?

    • 携带给服务器额外信息,让服务器返回我想要的某一部分数据而不是全部数据

    • 举例:查询河北省下属的城市列表,需要先把河北省传递给服务器

     

    1. 查询参数的语法 ?

      • 在 url 网址后面用?拼接格式:XXXX参数名1=值1&参数名2=值2

      • 参数名一般是后端规定的,值前端看情况传递即可

    2. axios 如何携带查询参数?

      使用 params 选项即可
    axios({url: '目标资源地址',params: {参数名: 值}
    }).then(result => {// 对服务器返回的数据做后续处理
    })

     常用请求和数据提交

    想要提交数据,先来了解什么是请求方法

    • 请求方法是一些固定单词的英文,例如:GET,POST,PUT,DELETE,PATCH(这些都是http协议规定的),每个单词对应一种对服务器资源要执行的操作。

    什么时候进行数据提交呢?

    • 例如:多端要查看同一份订单数据,或者使用同一个账号进行登录,那订单/用户名+密码,就需要保存在服务器上,随时随地进行访问

     axios 如何提交数据到服务器呢?

    axios({url: '目标资源地址',method: '请求方法',data: {参数名: 值}
    }).then(result => {// 对服务器返回的数据做后续处理
    })

    AXIOS的错误处理

    Axios 的错误处理 是开发中非常重要的一部分,能够有效应对网络请求中的各种异常情况(如网络错误、服务器错误、超时等)。Axios 提供了多种方式来处理错误,包括 catch 方法、try/catch 语法(结合 async/await)以及拦截器机制。

     

    Axios 的错误对象包含以下关键属性:

    • message:错误描述。

    • response:服务器返回的响应对象(如果有)。

      • status:HTTP 状态码(如 404、500)。

      • data:服务器返回的错误数据。

    • request:请求对象(如果请求已发出但未收到响应)。

    • config:请求的配置信息。

    示例:使用 catch 处理错误

    axios.get('https://api.example.com/data').then(response => {console.log('请求成功:', response.data);}).catch(error => {if (error.response) {// 服务器返回了错误状态码(4xx/5xx)console.error('服务器错误:', error.response.status, error.response.data);} else if (error.request) {// 请求已发出但未收到响应console.error('网络错误:', error.message);} else {// 其他错误(如配置错误)console.error('请求配置错误:', error.message);}});
     

    示例:使用 async/await 处理错误

    async function fetchData() {try {const response = await axios.get('https://api.example.com/data');console.log('请求成功:', response.data);} catch (error) {if (error.response) {console.error('服务器错误:', error.response.status, error.response.data);} else if (error.request) {console.error('网络错误:', error.message);} else {console.error('请求配置错误:', error.message);}}
    }
     



    表白是表明心意,不是索取关系。


     

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29724.html

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

    相关文章

    STM32-I2C通信协议

    目录 一:什么是I2C通信协议 二:I2C通信 三:I2C时序图 四:面试常见问题 一:什么是I2C通信协议 I2C(Inter-Integrated Circuit)协议是一种串口通信协议,用于在集成电路之间传输数…

    阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1

    阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…

    GitCode 助力 vue3-element-admin:开启中后台管理前端开发新征程

    源码仓库: https://gitcode.com/youlai/vue3-element-admin 后端仓库: https://gitcode.com/youlai/youlai-boot 开源助力,开启中后台快速开发之旅 vue3-element-admin 是一款精心打造的免费开源中后台管理前端模板,它紧密贴合…

    接入DeepSeek,九牧开启AI卫浴新赛道!

    2025年或可被称为AI新纪元元年,“具身智能”“智能机器人”“6G”等新词语出现在《政府工作报告》里,国家对制造业转型和“人工智能”的发展提出殷切期望。 近年来,围绕数智化,制造业开启了一场全球竞赛,在无人机、高…

    概率、泛化与过拟合

    1. 贝叶斯定理 (Bayes Rule) 贝叶斯公式,又称贝叶斯定理、贝叶斯法则,最初是用来描述两个事件的条件概率间的关系的公式,后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是,支持某项属性的事件发生得愈多&#…

    基于Python实现的智能旅游推荐系统(Django)

    基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页,旅游资讯,景点信息…

    php代码审计工具-rips

    代码审计 代码审计就是检查所写的代码中是否有漏洞,检查程序的源代码是否有权限从而被黑客攻击,同时也检查了书写的代码是否规范。通过自动化的审查和人工审查的方式,逐行检查源代码,发现源代码中安全缺陷所造成的漏洞&#xff0…

    深入剖析分布式事务:原理、方案与实战指南

    引言:为什么分布式事务成为架构师的必修课? 在微服务架构大行其道的今天,单体应用被拆分成多个独立服务。当一次业务操作需要跨多个服务/数据库完成时,传统数据库事务的ACID特性不再适用。订单创建需要同时操作订单服务和库存服务…

    C语言100天练习题【记录本】

    C语言经典100题(手把手 编程) 可以在哔哩哔哩找到(url:C语言经典100题(手把手 编程)_哔哩哔哩_bilibili) 已解决的天数:一,二,五,六,八&#xf…

    计算机毕设-基于springboot的物业管理系统的设计与实现(附源码+lw+ppt+开题报告)

    博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

    Trae IDE新建C#工程

    目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说,Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…

    Linux 进程管理

    一.进程 1.基本介绍 在Linux中每一个执行的程序都称之为进程,每一个进程都会分配一个进程号(PID)。进程以前台和后台两种方式存在,前台进程就是我们可以在屏幕上操作的,后台进程我们无法在屏幕上看到。 程序是静态的…

    最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)

    前期所需: 1.apache-tomcat-10.1.18-windows-x64(tomcat 10.1.8版本或者差不多新的版本都可以) 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了(一定先配置MAVEN再搞TOMCAT会事半功倍很多) 如果有没配置…

    fiddler everywhere 绿色永久版

    目录: 1. 下载并安装 FiddlerEverywhere v5.16.02. 下载并安装 FiddlerEverywherePatcher 补丁3. 修改 FiddlerEverywhere 版本号4. 再打开 FiddlerEverywhere 即可正常使用 亲测有效!!!以 Windows 10 FiddlerEverywhere v5.16.0 …

    TypeError: Cannot assign to read only property ‘xxx‘ of object ‘#<Object>‘

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

    【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型

    一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法: bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1举例: create table testBit(id i…

    python-leetcode-统计构造好字符串的方案数

    2466. 统计构造好字符串的方案数 - 力扣(LeetCode) 这个问题可以用**动态规划(DP)**来解决,思路如下: 思路 1. 定义 DP 数组 设 dp[i] 表示长度为 i 的好字符串的个数。 2. 状态转移方程 我们可以在 dp…

    Java为什么是跨平台的

    一、Java虚拟机(JVM)的抽象层作用 JVAM是Java跨平台的核心技术。Java代码编译后生成字节码(.class文件),这些字节码并非直接由操作系统执行,而是由JVM解释或编译为特定平台的机器码。 屏蔽底层差异:JVM为不同操作系统提供统一的运行时环境,开…

    RuleOS:区块链开发的“破局者”,开启Web3新纪元

    RuleOS:区块链开发的“破冰船”,驶向Web3的星辰大海 在区块链技术的浩瀚宇宙中,一群勇敢的探索者正驾驶着一艘名为RuleOS的“破冰船”,冲破传统开发的冰层,驶向Web3的星辰大海。这艘船,正以一种前所未有的姿…

    python: DDD+ORM using oracle 21c

    sql script: create table GEOVINDU.School --創建表 ( SchoolId char(5) NOT NULL, -- SchoolName nvarchar2(500) NOT NULL, SchoolTelNo varchar(8) NULL, PRIMARY KEY (SchoolId) --#主鍵 );create table GEOVINDU.Teacher ( TeacherId char(5) NOT NULL , TeacherFirstNa…