在前端开发中,常见的网络请求方式 ajax、axios 和 fetch 分别是什么?请对比它们在实现原理、兼容性、请求拦截、响应转换以及错误处理等方面的核心差异。
考察说明
考查候选人对前端三种主流网络请求方式底层实现和特性的理解,以及在实际开发中的选型能力。
回答思路
- 【回答框架 1】ajax 是基于 XMLHttpRequest 对象的封装,通过创建 XHR 实例并配置 open、send 等方法发起请求,支持 onreadystatechange 回调处理响应。其核心特点是历史悠久、兼容性好,但代码冗余且不支持 Promise,需要手动处理状态码和事件绑定。
- 【回答框架 2】fetch 是浏览器原生提供的基于 Promise 的 API,语法简洁,采用 Request 和 Response 对象,支持流式读取。但 fetch 在请求失败时(如网络错误)会 reject,而 HTTP 错误状态码(如 404、500)不会触发 reject,需要手动检查 response.ok。此外,fetch 默认不发送 cookies,需配置 credentials。
- 【回答框架 3】axios 是基于 XHR 的第三方库,内部封装了 XHR 和 http 模块(Node.js),返回 Promise,并自动做 JSON 转换。axios 提供了请求和响应拦截器、取消请求(CancelToken)和全局配置等丰富功能,错误处理更统一(所有非 2xx 状态都会进入 catch)。
- 【回答框架 4】选型建议:如果项目需要兼容老版本浏览器且功能简单,可用原生 ajax 或 axios;现代项目中,axios 功能全面、生态成熟,是常用选择;fetch 适合追求原生和轻量的场景,但需配合封装处理错误和超时。
- 【回答框架 5】实际项目中常抹平差异:基于 fetch 做封装,统一处理超时、错误、请求头,并实现拦截器,或直接采用 axios 成熟的方案。
- 【关键点 1】ajax 基于 XMLHttpRequest,fetch 和 axios 均返回 Promise
- 【关键点 2】axios 自动处理 JSON 转换并支持拦截器和取消请求
- 【关键点 3】fetch 在 HTTP 错误状态码下不会 reject,需手动判断 response.ok
- 【关键点 4】axios 兼容性更好,浏览器和 Node.js 均可使用