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

第37篇:原生AJAX从零手写源码——彻底弄懂前端网络请求底层

前言

在前面章节我们使用过 Fetch、封装过 Promise 请求。

Fetch 是现代API,真正前端网络底层根基永远是:AJAX(XMLHttpRequest)

绝大多数新人只会调用接口,从来不知道:

  • 网络请求底层是怎么建立的

  • 请求头、响应头如何配置

  • 请求状态码、 readyState 到底是什么

  • 为什么可以异步不阻塞页面

本篇带你从零手写完整原生AJAX源码,弄懂前端网络底层,吊打面试网络原理题,同时为下一篇跨域知识点打下绝对基础。

一、AJAX是什么?(面试满分定义)

AJAX 是异步的 JavaScript 和 XML,核心作用:在不刷新页面的情况下,与服务器进行异步数据通信

前端所有接口请求底层根源都是 AJAX:

  • jQuery.ajax 底层 => XMLHttpRequest

  • axios 底层 => XMLHttpRequest

  • Fetch 是新规范,但底层思想依然是AJAX异步通信

二、AJAX 核心五大步骤(必背)

  1. 创建请求实例:new XMLHttpRequest()

  2. 初始化请求:open(请求方式, 接口地址, 是否异步)

  3. 监听状态变化:onreadystatechange

  4. 发送请求:send()

  5. 接收响应数据:判断状态码、解析数据

三、readyState 五状态详解(面试必考)

  • 0:未初始化,未调用open

  • 1:请求已建立,未发送

  • 2:请求已发送,响应头已返回

  • 3:正在接收响应数据(部分返回)

  • 4请求彻底完成,数据全部接收成功

我们真正处理业务逻辑,只判断readyState === 4

四、状态码 status 含义

  • 200:请求成功

  • 404:接口地址不存在

  • 403:权限不足

  • 500:服务器报错

五、手写完整AJAX(GET请求完整版)

// 1. 创建xhr实例 const xhr = new XMLHttpRequest(); // 2. 初始化请求方式和地址 // 第三个参数:true=异步 false=同步 xhr.open("GET","https://jsonplaceholder.typicode.com/posts/1",true); // 3. 监听状态变化 xhr.onreadystatechange = function(){ // 请求完成 if(xhr.readyState === 4){ // 请求成功 if(xhr.status === 200){ // 拿到服务器返回数据 console.log("请求成功:",JSON.parse(xhr.responseText)); }else{ console.log("请求失败:",xhr.status); } } } // 4. 发送请求 xhr.send(null);

六、手写POST请求(带请求体、请求头)

const xhr = new XMLHttpRequest(); xhr.open("POST","https://xxx.com/api",true); // POST必须手动设置请求头 xhr.setRequestHeader("Content-Type","application/json"); xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ console.log(xhr.status,xhr.responseText); } } // 传递JSON参数 const data = JSON.stringify({name:"张三",age:18}); xhr.send(data);

七、封装Promise版AJAX(企业通用)

把原生AJAX封装成 Promise,兼容 async/await,对标 axios 底层思想。

function ajax(url,method="GET",data=null){ return new Promise((resolve,reject)=>{ const xhr = new XMLHttpRequest(); xhr.open(method,url,true); // 设置请求头 xhr.setRequestHeader("Content-Type","application/json"); xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ if(xhr.status >=200 && xhr.status <300){ resolve(JSON.parse(xhr.responseText)); }else{ reject("请求失败:" + xhr.status); } } } // 发送数据 xhr.send(data ? JSON.stringify(data) : null); }) } // 使用 ajax("https://jsonplaceholder.typicode.com/posts") .then(res=>console.log(res)) .catch(err=>console.log(err));

八、本篇结语

学完本篇,你不再是只会调用 Fetch、axios 的小白。

你真正掌握了前端网络请求底层原理,理解请求全过程、状态流转、头部配置、参数传递。

所有网络框架万变不离其宗,底层全部是 AJAX。

下一篇我们攻克前端超级高频痛点:跨域问题与全套解决方案,彻底解决项目接口报错问题。

http://www.jsqmd.com/news/1229726/

相关文章:

  • 逆变器芯片失效分析与防护设计实践
  • 空调单元电路解析与维修优化实践
  • 【维修笔记】吉时利2750数据采集器进水后不开机+异响故障排查实录
  • Funchook架构设计解析:理解函数钩子库的内部工作机制
  • 2026年河南GRG生产商有哪些 综合实力排行完整盘点 - 奔跑123
  • C++实现DES加密算法:从Feistel结构到分组密码实践
  • MarkItDown:终极文档转换神器,20+格式一键变Markdown的完整指南
  • Windows微信QQ防撤回终极指南:免费保护你的重要消息不被撤回
  • 知乎 4031「频率过高」怎么处理?草稿会留下吗?
  • Blender插件实战:解决PMX转VRM的材质、骨骼与表情三大核心难题
  • DDR5与DDR4兼容方案:Meta与台积电的技术突破
  • 家庭英语启蒙:6个月自然掌握1000词汇的黄金法则
  • RoboPOJOGenerator插件开发指南:如何扩展支持新的JSON库和注解框架
  • https自动续期-httpsok
  • 编写程序分析日常工作里重复操作的流程,每周选取一个流程设计自动化或者优化创新方案。
  • 2026郑州靠谱搬家公司深度实测排名|分场景打分+路段精准适配+避坑指南(全新版) - 达海
  • Ruru安全检测原理:深入Package Manager命令与API调用分析
  • Markdown-Edit终极指南:Windows平台最简洁的Markdown编辑器完全解析
  • 制造业三单匹配、出库入库汇总,哪些场景能用Agent自动化?——解析企业级AI Agent落地技术架构与应用边界
  • i-book.in_Archive开发环境搭建:Python3+Docker+Elasticsearch完整配置指南
  • AI数据库:一套引擎替代交易库+数仓+向量库+数据湖
  • 线上图文/视频投票评选活动从零搭建完整操作指南,小白也能轻松发起
  • 小程序毕业设计-基于 SpringBoot 与协同过滤算法的音乐推荐系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • WPS AI表格公式自动生成秘技:1秒替代手动写VLOOKUP+IF嵌套,打工人必须抢学的4类模板
  • 日本AI进展为何缓慢?解析制度、安全与文化约束下的技术演进逻辑
  • Godot与Unreal Engine深度对比:从设计哲学到实战选型指南
  • 如何用OpenCore Legacy Patcher让老旧Mac焕发新生:3个关键步骤解锁最新macOS
  • 收藏!文科生也能月入34万,大厂抢夺的“提示词工程师”和“人机训练师”了解一下!
  • 01-环境搭建、点亮LED、呼吸灯
  • 应用开发治理难在哪?2026企业级应用开发管理平台横评