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

前端面经--网络通信与后端协作篇--XMLHttpRequest、axios、fetch、AbortController

一、XMLHttpRequest

1、什么是 XMLHttpRequest?

XMLHttpRequest(简称 XHR)是浏览器提供的一个异步通信接口,允许网页在不刷新页面的情况下,与服务器交换数据。

它是AJAX(Asynchronous JavaScript and XML)技术的核心,广泛用于早期前端开发中发起 HTTP 请求。

关键词:异步、局部更新、动态刷新

XHR 的引入标志着网页从“静态展示”变为“动态交互”的关键转折。

2、基本使用方式 

const xhr = new XMLHttpRequest()xhr.open('GET', '/api/user', true)xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log(xhr.responseText)}
}xhr.send()

3、重要属性说明

属性含义
readyState请求状态(0~4),4 表示完成
statusHTTP 状态码(如 200、404)
responseText返回的字符串数据
responseXML返回的 XML 数据(已不常用)
onreadystatechange状态变化时触发的回调函数

4、readyState 状态机说明

描述
0请求未初始化
1请求已建立,尚未发送
2请求已发送,收到响应头
3正在接收响应体
4请求完成,响应就绪

 完整 POST 示例(含 JSON)

const xhr = new XMLHttpRequest()
xhr.open('POST', '/api/login', true)
xhr.setRequestHeader('Content-Type', 'application/json')xhr.onreadystatechange = () => {if (xhr.readyState === 4) {if (xhr.status === 200) {const data = JSON.parse(xhr.responseText)console.log('登录成功', data)} else {console.error('登录失败', xhr.status)}}
}xhr.send(JSON.stringify({ username: 'alice', password: '123456' }))

5、XHR 的优势和局限

✅ 优点:

  • 所有浏览器都支持(包括 IE6)

  • 可处理复杂场景:进度监听、分块接收等

  • 自由控制请求方式与状态码处理

❌ 缺点:

问题说明
语法繁琐需手动管理状态、编码结构混乱
回调地狱没有 Promise,易出错
不支持 async/await写法不现代化,难维护
不直观状态码判断、数据解析都要手写逻辑

6、常用高级功能

功能示例说明
设置请求头xhr.setRequestHeader('key', 'value')如 Content-Type、Authorization 等
设置超时xhr.timeout = 5000超时后触发 ontimeout 回调
请求取消xhr.abort()可中断请求
监听错误xhr.onerror = () => {}网络错误或跨域失败时触发

二、fetch

1、什么是 fetch? 

fetch浏览器原生的 HTTP 请求接口,用于在前端发送网络请求,基于 Promise 实现,替代早期的 XMLHttpRequest(XHR)。

它支持现代的异步语法(如 async/await),使得请求处理更加清晰、易读。

2、基本语法

fetch(url, options).then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error))
  • url:请求地址

  • options:请求配置对象(method、headers、body 等)

3 、常用配置选项详解

fetch('/api/data', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': 'Bearer token123'},body: JSON.stringify({ name: 'Alice' }),credentials: 'include', // 携带 cookiemode: 'cors' // 跨域请求
})
选项说明
method请求方式,如 GETPOSTPUT
headers请求头配置
body请求体,仅 POST/PUT 有效
credentials是否携带 Cookie(如 include
mode请求模式:corssame-originno-cors

 4、响应处理(Response 对象)

fetch('/api/user').then(response => {if (!response.ok) {throw new Error('请求失败: ' + response.status)}return response.json()}).then(data => console.log(data))
  • response.ok:状态码是否是 200-299

  • response.status:状态码

  • response.json():解析 JSON 响应体

  • 也可以使用 response.text()response.blob()response.formData()

5、fetch 常见注意事项

问题描述
❌ 不自动抛出 HTTP 错误fetch 只对网络错误抛出异常,4xx/5xx 状态不会报错,需要手动判断
❌ 默认不带 Cookie需要设置 credentials: 'include'
❌ 不支持请求超时必须配合 AbortController 手动实现
❌ 不支持拦截器axios 相比,功能较原始,需要自己封装

6、fetch 与 XMLHttpRequest 对比

特性fetchXMLHttpRequest
是否原生✅ 是✅ 是
Promise 支持✅ 原生支持❌ 需手动封装
请求写法简洁优雅语法繁琐
错误处理仅网络失败抛出异常onerroronload
请求取消✅ 支持(AbortController❌ 需 hack

7、使用场景总结

场景适用性
简单数据请求✅ 适合
精细控制请求头/体✅ 灵活
前端自己封装统一请求模块✅ 推荐
项目已有 axios 等库❌ 不建议重复使用 fetch

 三、axios

1、什么是 Axios?

Axios 是一个基于 Promise 的浏览器和 Node.js 的 HTTP 客户端。

它封装了 XMLHttpRequest(XHR)请求,在语法、功能、兼容性和错误处理方面都更友好,是前端项目中使用最广泛的请求库之一。

2、Axios 的核心优势

优势描述
简洁语法默认封装请求/响应处理
自动转换 JSON请求数据和返回数据自动处理为 JS 对象
拦截器支持请求和响应统一处理,如添加 token、错误处理
取消请求内置取消机制(CancelToken)
浏览器兼容性好支持 IE 和移动端浏览器
SSR 友好可在 Node.js 中使用(如在 Nuxt/Next 等服务端渲染框架中)

3、基本使用示例 

GET 请求:
import axios from 'axios'
axios.get('/api/user?id=123').then(res => console.log(res.data)).catch(err => console.error(err))
POST 请求:
axios.post('/api/login', {username: 'alice',password: '123456'
})
.then(res => console.log(res.data))
.catch(err => console.error(err))

4、常用配置项(axios 请求选项) 

axios({url: '/api/user',method: 'post',headers: {'Content-Type': 'application/json','Authorization': 'Bearer xxx'},data: {name: 'Alice'},params: {page: 1,size: 10},timeout: 5000, // 设置超时时间(单位毫秒)withCredentials: true // 是否携带 Cookie
})

5 、拦截器机制(非常重要)

 拦截器是 axios 的强大功能,允许在请求发送前、响应返回后统一做处理

请求拦截器:
axios.interceptors.request.use(config => {// 在请求发送前做统一处理,如添加 tokenconfig.headers.Authorization = 'Bearer ' + localStorage.getItem('token')return config
})响应拦截器:
axios.interceptors.response.use(res => res.data, // 默认直接返回 dataerr => {if (err.response && err.response.status === 401) {// 处理未授权错误console.warn('未登录或登录过期')}return Promise.reject(err)}
)

 6、取消请求(防抖、离开页面时中断请求)

const controller = new AbortController()axios.get('/api/user', { signal: controller.signal }).then(res => console.log(res)).catch(err => {if (axios.isCancel(err)) {console.log('请求取消')}})// 手动取消
controller.abort()

7、与 fetch 的对比

特性axiosfetch
是否原生❌ 第三方库✅ 浏览器原生
自动转换 JSON✅ 自动解析❌ 手动 .json()
错误处理✅ 4xx/5xx 会自动抛出❌ 只抛网络错误
拦截器✅ 有请求/响应拦截器❌ 需要手动封装
请求取消✅ CancelToken / signal✅ 使用 AbortController
默认超时✅ 可配置 timeout❌ 需自己实现超时逻辑

8、常见问题处理

问题原因/解决
请求失败 401token 过期,响应拦截器中处理
跨域请求无效设置 withCredentials: true 且服务端支持
下载文件失败设置 responseType: 'blob'
后端接口路径变化频繁使用 baseURL 统一管理

 Axios 是一个功能强大、封装完善、兼容性好的 HTTP 客户端,适合绝大多数前端项目使用,尤其适用于中大型应用的请求模块封装与统一管理。

四、AbortController 

1、什么是 AbortController

AbortController 是浏览器原生提供的控制器对象,用来取消正在进行的异步操作(如 fetch 请求)。

它配合 AbortSignal 使用,通过手动调用 .abort() 来中止任务,是现代前端实现“中断请求”的推荐方式。

构成关系

const controller = new AbortController()
const signal = controller.signal
controller.abort():发出取消信号
signal:传给支持取消的 API(如 fetch),用于监听取消状态

2、常见用途场景

场景描述
请求超时避免接口长时间无响应卡住页面
切换页面时中断请求避免页面卸载后还处理响应导致报错
防抖节流快速连续点击或输入时,只保留最后一个请求
组件卸载时取消请求React / Vue 组件卸载后避免内存泄漏

 AbortController 是控制异步任务取消的原生工具,适用于 fetch / axios 请求的取消和超时控制,是现代前端必备的稳定性与性能优化手段。

 剩还有些内容等博主想到就继续更新

相关文章:

  • Java 对象克隆(Object Cloning)详解
  • 基于LSTM与SHAP可解释性分析的神经网络回归预测模型【MATLAB】
  • AI学习路径
  • Ubuntu 服务器管理命令笔记
  • 查看单元测试覆盖率
  • SHA系列算法
  • C PRIMER PLUS——第6-2节:二维数组与多维数组
  • 算法中的数学:约数
  • mobile自动化测试-appium webdriverio
  • 【deepseek教学应用】001:deepseek如何撰写教案并自动实现word排版
  • 单体架构实现延时任务
  • 《Zabbix Proxy分布式监控实战:从安装到配置全解析》
  • 删除链表倒数第N个节点
  • 微信小程序上传视频,解决ios上传完video组件无法播放
  • iPhone手机连接WiFi异常解决方法
  • 森林生态学研究深度解析:R语言入门、生物多样性分析、机器学习建模与群落稳定性评估
  • 缓存局部性保留
  • R 语言机器学习:为遥感数据处理开启新视角
  • C++ 复习(一)
  • 【HCIP】----OSPF综合实验
  • 最快3天开通一条定制公交线路!上海推出服务平台更快响应市民需求
  • 著名国际关系理论家、“软实力”概念提出者约瑟夫•奈逝世
  • 法治日报:商品明细是隐私,外卖员快递员不应知晓
  • 上海一中院一审公开开庭审理被告人胡欣受贿案
  • 印观察|印巴战火与莫迪政府三重冒险:南亚火药桶已至临界点
  • 韩国法院将李在明所涉案件重审日期延至大选后