news 2026/7/20 18:38:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第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。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 18:36:10

为什么选择AL语言扩展?10个理由让你爱上Business Central开发

为什么选择AL语言扩展&#xff1f;10个理由让你爱上Business Central开发 【免费下载链接】AL Home of the Dynamics 365 Business Central AL Language extension for Visual Studio Code. Used to track issues regarding the latest version of the AL compiler and develop…

作者头像 李华
网站建设 2026/7/20 18:35:53

知乎 4031「频率过高」怎么处理?草稿会留下吗?

知乎 4031「频率过高」怎么处理&#xff1f;草稿会留下吗&#xff1f; 先说结论&#xff1a;知乎返回 403/4031「频率过高&#xff0c;24 小时后重试」时&#xff0c;不应该把它当成“这次什么都没发生”。按我们近期内容流水线的实测&#xff0c;这类失败往往已经在知乎侧留下…

作者头像 李华
网站建设 2026/7/20 18:35:47

选GEO优化不踩坑手册:国内5家头部知名 GEO 服务商优劣势深度对比

不少品牌已经发现&#xff0c;持续投放传统 SEO 内容很难再带来稳定增量流量&#xff0c;核心根源在于用户检索行为的彻底转变。行业形成两条清晰的变革主线&#xff1a;一是流量渠道结构性迁徙&#xff0c;用户从品牌认知、产品对比到成交咨询的全流程都依赖 AI 问答工具&…

作者头像 李华
网站建设 2026/7/20 18:35:20

语言通信的新纪元:语聊大厅与语音聊天APP系统

语言通信的新纪元&#xff1a;语聊大厅与语音聊天APP系统 随着移动互联网的飞速发展&#xff0c;人们对于即时通讯的需求日益增长。在众多通讯方式中&#xff0c;基于语音的交流因其便捷性和亲密性而备受青睐。然而&#xff0c;运营语聊大厅或语音聊天APP的商家常常面临着一系列…

作者头像 李华
网站建设 2026/7/20 18:28:40

Claude Code技能系统:10个改变开发工作流的必备技能

1. Claude Code技能生态概览Claude Code作为新一代智能编程助手&#xff0c;其真正的威力来自于开放的技能(Skills)生态系统。这个系统允许开发者通过模块化扩展来增强Claude的核心能力&#xff0c;就像给智能手机安装App一样简单。经过数月实践&#xff0c;我发现以下10个技能…

作者头像 李华