前端面经--网络通信与后端协作篇--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 表示完成
status HTTP 状态码(如 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', // 携带 cookie
  mode: '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 对比

特性 fetch XMLHttpRequest
是否原生 ✅ 是 ✅ 是
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 => {
  // 在请求发送前做统一处理,如添加 token
  config.headers.Authorization = 'Bearer ' + localStorage.getItem('token')
  return config
})

响应拦截器:
axios.interceptors.response.use(
  res => res.data, // 默认直接返回 data
  err => {
    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 的对比

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

8、常见问题处理

问题 原因/解决
请求失败 401 token 过期,响应拦截器中处理
跨域请求无效 设置 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 请求的取消和超时控制,是现代前端必备的稳定性与性能优化手段。

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

相关推荐
m0_zj11 分钟前
58.[前端开发-前端工程化]Day05-webpack-Git安装-配置-Git命令
前端·webpack·node.js
GanGuaGua13 分钟前
CSS:字体和文本样式
前端·css
Attacking-Coder22 分钟前
前端面试宝典---JavaScript import 与 Node.js require 的区别
前端·javascript·node.js
切糕师学AI27 分钟前
vue 中如何使用region?
前端·javascript·vue.js
蓝婷儿27 分钟前
前端面试每日三题 - Day 28
前端·面试·职场和发展
巷95541 分钟前
深度学习模型的部署实践与Web框架选择
前端·人工智能·深度学习
年纪轻轻只想躺平1 小时前
JavaScript ES6+ 最佳实践
前端·javascript·es6
Edward-tan1 小时前
【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI
前端·spira-ui
qq_278063711 小时前
vue2 结合后端预览pdf 跨域的话就得需要后端来返回 然后前端呈现
前端·pdf
桥豆麻袋93931 小时前
vite 初始化react项目
前端·react.js·前端框架