一、核心对比表
| 特性 | jQuery AJAX | fetch | axios | XMLHttpRequest |
|---|---|---|---|---|
| API 风格 | 回调/链式 | Promise | Promise | 回调 |
| 语法简洁 | 是 | 是 | 是 | 否 |
| 默认 JSON 解析 | 可自动(dataType) | 需手动 response.json() | 自动解析 | 否 |
| 超时处理 | 内置 | 需配合 AbortController | 内置 | 有 timeout 属性 |
| 拦截器 | 无 | 无 | 有 | 无 |
| 取消请求 | abort() | AbortController | CancelToken | abort() |
| 并发请求 | $.when | 需手动实现 | axios.all | 需手动实现 |
| 错误处理 | 统一 | 网络错误 reject | HTTP错误自动 reject | 需手动判断 status |
| 上传/下载进度 | 支持 | 下载支持(上传不支持) | 支持 | 支持 |
| 跨域支持 | 需后端支持 | 需后端支持 | 需后端支持 | 需后端支持 |
| 浏览器兼容性 | IE6+ | IE 不支持 | IE 支持 | IE6+ |
| 体积 | 较大(jQuery库) | 无 | 小(约15KB gzip) | 无 |
| Node.js 支持 | 否 | 否 | 是 | 否 |
二、代码对比
1. jQuery AJAX
$.ajax({
url: '/api/data',
type: 'GET',
dataType: 'json',
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.error(error);
}
});
2. fetch
fetch('/api/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
3. axios
axios.get('/api/data')
.then(response => console.log(response.data))
.catch(error => console.error(error));
4. XMLHttpRequest
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
console.log(data);
}
};
xhr.send();
三、优缺点总结
jQuery AJAX
- 优点:语法简单;兼容性极好;与 jQuery 生态无缝集成;自动处理 JSON、表单序列化等。
- 缺点:需引入整个 jQuery 库(体积大);回调风格不如 Promise 优雅;新项目已不推荐。
fetch
- 优点:原生支持、语法简洁、基于 Promise,易与 async/await 配合。
- 缺点:IE 不支持(需 polyfill);超时/取消需额外代码;HTTP 错误需手动处理;上传进度不支持。
axios
- 优点:语法简洁,自动 JSON 解析,支持拦截器、取消、超时、并发等高级功能;兼容性好;支持 Node.js。
- 缺点:需引入第三方库;体积略大。
XMLHttpRequest
- 优点:原生、兼容所有主流浏览器;底层可控。
- 缺点:API繁琐,需处理多个状态和回调;不支持 Promise;缺少高级功能。
四、场景推荐与选择建议
- 老项目/IE兼容/已用jQuery:继续用 jQuery AJAX 或 XMLHttpRequest。
- 现代项目/语法简洁/功能丰富:推荐 axios。
- 轻量级/无需引入库/只需基本功能:推荐 fetch(注意 IE 不支持)。
- 底层定制/极致兼容性:原生 XMLHttpRequest。
五、实际开发建议
- 企业级项目、复杂请求、需要统一处理(如 token、错误、拦截器):优选 axios。
- 个人/小型项目,追求极简:fetch 足够。
- 需支持 IE 或极致兼容性:jQuery AJAX 或 XMLHttpRequest。
- 新项目不建议再用 jQuery AJAX,除非有历史包袱。
六、总结
- jQuery AJAX:历史遗留项目用,已不推荐新项目。
- fetch:现代浏览器主流,语法优雅,适合简单场景。
- axios:功能最全,适合复杂和企业级项目。
- XMLHttpRequest:底层原生,了解原理即可,实际开发不推荐直接使用。
七、fetch 简介
fetch 是现代浏览器原生提供的用于发送网络请求的 API,语法简洁、基于 Promise,替代了传统的 XMLHttpRequest。它可以用于 GET、POST、PUT、DELETE 等各种 HTTP 请求。
八、fetch 基本语法
fetch(url, options)
.then(response => {
// 处理响应对象
})
.catch(error => {
// 处理错误
});
url:请求地址options:可选参数对象,包含 method、headers、body 等
九、常用参数详解
1. method(请求方法)
fetch('https://api.example.com/data', {
method: 'POST'
});
2. headers(请求头)
fetch('https://api.example.com/data', {
headers: {
'Content-Type': 'application/json'
}
});
3. body(请求体)
仅适用于如 POST、PUT 等有请求体的方法。
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Tom', age: 18 })
});
4. credentials(携带 Cookie)
'omit'(默认):不带 cookie'same-origin':同源带 cookie'include':跨域也带 cookie
fetch(url, {
credentials: 'include'
});
十、处理响应数据
fetch 返回的是一个 Promise,resolve 的对象是 Response 实例,需要进一步处理数据:
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) { // 检查 HTTP 状态码
throw new Error('网络响应不是 2xx');
}
return response.json(); // 解析为 JSON
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('请求失败', error);
});
常用解析方法:
response.json():解析为 JSONresponse.text():解析为文本response.blob():解析为二进制大对象(如图片、文件)response.formData():解析为表单数据
十一、完整示例
GET 请求
fetch('https://api.example.com/users')
.then(res => res.json())
.then(data => {
console.log(data);
});
POST 请求
fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Alice' })
})
.then(res => res.json())
.then(data => {
console.log(data);
});
十二、错误处理
fetch只会在网络错误(如断网)时进入catch,对于 HTTP 错误(如 404、500),需手动判断response.ok。- 推荐统一处理:
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('HTTP 错误:' + response.status);
}
return response.json();
})
.then(data => { /* ... */ })
.catch(error => { /* ... */ });
十三、与 XMLHttpRequest 区别
| 特点 | fetch | XMLHttpRequest |
|---|---|---|
| API 风格 | Promise | 回调函数 |
| 语法简洁 | 是 | 否 |
| 跨域携带 Cookie | 需设置 credentials | 需设置 withCredentials |
| 支持取消请求 | 需配合 AbortController | 直接 abort() |
| 兼容性 | 现代浏览器 | 所有主流浏览器 |
十四、进阶用法
1. 超时处理
fetch 没有内置超时,可以用 AbortController:
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
fetch(url, { signal: controller.signal })
.then(res => res.json())
.then(data => console.log(data))
.catch(err => {
if (err.name === 'AbortError') {
console.error('请求超时');
}
});
2. 文件上传
const formData = new FormData();
formData.append('file', fileInput.files[0]);
fetch('/upload', {
method: 'POST',
body: formData
});
十五、注意事项
fetch不会自动 reject HTTP 错误(如 404),需手动判断。- 默认不带 cookie,需设置
credentials。 - 兼容性:IE 不支持 fetch,需 polyfill。
- 跨域问题需后端支持 CORS。
十六、总结
fetch是现代前端异步请求的主流方式,语法简洁、易于链式处理。- 推荐配合 async/await 使用,代码更清晰。
- 实际开发中还可使用 axios 等第三方库,功能更丰富。
十七、axios 简介
axios 是一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js。它用于发送异步请求,支持 GET、POST、PUT、DELETE 等常见方法,语法简洁,功能强大,兼容性好。
十八、安装和引入
1. 安装
npm install axios
# 或
yarn add axios
2. 引入
import axios from 'axios';
// 或在浏览器中直接用 <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
十九、基本用法
1. GET 请求
axios.get('https://api.example.com/users')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
2. POST 请求
axios.post('https://api.example.com/users', {
name: 'Alice',
age: 25
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
3. 配合 async/await
async function getUsers() {
try {
const response = await axios.get('https://api.example.com/users');
console.log(response.data);
} catch (error) {
console.error(error);
}
}
getUsers();
二十、常用配置项
axios 的请求配置项非常丰富,常用的有:
axios({
url: 'https://api.example.com/users',
method: 'post',
headers: {
'Authorization': 'Bearer token',
'Content-Type': 'application/json'
},
params: { // GET 查询参数
id: 123
},
data: { // POST/PUT 请求体
name: 'Bob'
},
timeout: 5000, // 超时时间(毫秒)
withCredentials: true // 跨域携带 cookie
});
二十一、响应结构
axios 的响应对象结构如下:
axios.get(url).then(response => {
console.log(response.data); // 服务器返回的数据
console.log(response.status); // HTTP 状态码
console.log(response.statusText); // 状态文本
console.log(response.headers); // 响应头
console.log(response.config); // 请求配置
});
二十二、错误处理
axios 的错误对象结构:
axios.get(url)
.catch(error => {
if (error.response) {
// 服务器返回了错误响应(如 404, 500)
console.log(error.response.status);
console.log(error.response.data);
} else if (error.request) {
// 请求已发出但没有收到响应
console.log(error.request);
} else {
// 其他错误
console.log(error.message);
}
});
二十三、拦截器
拦截器可在请求发送前或响应到达后做统一处理(如添加 token、统一错误处理)。
1. 请求拦截器
axios.interceptors.request.use(config => {
// 在发送请求前做些什么
config.headers.Authorization = 'Bearer token';
return config;
}, error => {
// 对请求错误做些什么
return Promise.reject(error);
});
2. 响应拦截器
axios.interceptors.response.use(response => {
// 对响应数据做些什么
return response;
}, error => {
// 对响应错误做些什么
return Promise.reject(error);
});
二十四、取消请求
可使用 CancelToken 取消请求:
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
})
.catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('请求取消', thrown.message);
} else {
// 处理错误
}
});
// 取消请求
source.cancel('操作取消请求');
二十五、全局配置
可设置默认配置:
axios.defaults.baseURL = 'https://api.example.com/';
axios.defaults.headers.common['Authorization'] = 'Bearer token';
axios.defaults.timeout = 10000;
二十六、并发请求
可以同时发送多个请求:
axios.all([
axios.get('/user/1'),
axios.get('/user/2')
])
.then(axios.spread((res1, res2) => {
console.log(res1.data, res2.data);
}));
二十七、与 fetch 区别
| 特点 | axios | fetch |
|---|---|---|
| API 风格 | Promise | Promise |
| 默认 JSON | 自动解析 | 需手动 response.json() |
| 超时处理 | 内置 | 需配合 AbortController |
| 拦截器 | 有 | 无 |
| 取消请求 | 有(CancelToken) | 需配合 AbortController |
| 浏览器兼容性 | IE 支持 | IE 不支持 |
| 错误处理 | HTTP 错误自动 reject | 需手动判断 response.ok |
二十八、常见场景举例
文件上传
const formData = new FormData();
formData.append('file', fileInput.files[0]);
axios.post('/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
下载文件(blob)
axios.get('/download', { responseType: 'blob' })
.then(res => {
const url = window.URL.createObjectURL(res.data);
const a = document.createElement('a');
a.href = url;
a.download = 'file.zip';
a.click();
});
二十九、总结
- axios 用法简单,功能丰富,适合绝大多数前端项目。
- 推荐配合 async/await 使用,代码更清晰。
- 支持拦截器、取消、超时、全局配置、并发等高级功能。
- 对于需要兼容 IE 或有复杂请求需求的项目,axios 是优选。
三十、简介与原理
XMLHttpRequest 是浏览器原生提供的用于与服务器交换数据的对象。它允许你在不重新加载整个页面的情况下,发送 HTTP 请求并接收响应,实现 AJAX 技术的基础。
原理:
- 创建 XHR 对象。
- 配置请求(方法、地址、是否异步)。
- 发送请求。
- 监听响应状态变化,处理服务器返回的数据。
三十一、基本用法
1. GET 请求
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true); // true 表示异步
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText); // 响应内容
}
};
xhr.send();
2. POST 请求
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/data', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
};
xhr.send(JSON.stringify({ name: 'Tom', age: 18 }));
三十二、常用属性和方法
| 属性/方法 | 说明 |
|---|---|
open(method, url, async) | 初始化请求方法、地址和是否异步 |
send(body) | 发送请求(GET 无 body,POST/PUT 可传数据) |
setRequestHeader(key, value) | 设置请求头 |
onreadystatechange | 状态变化时触发的回调函数 |
readyState | 请求状态(0-4,见下表) |
status | HTTP 响应状态码 |
responseText | 响应文本数据 |
responseXML | 响应 XML 数据(如果返回的是 XML) |
abort() | 取消请求 |
timeout | 超时时间(毫秒) |
ontimeout | 超时回调 |
readyState 状态值
| 值 | 描述 |
|---|---|
| 0 | 未初始化 |
| 1 | 已打开(open) |
| 2 | 已发送(send) |
| 3 | 正在接收响应 |
| 4 | 响应已完成 |
三十三、常见场景
- 表单异步提交
- 局部刷新页面内容
- 动态加载数据(如分页、搜索建议)
- 文件上传/下载(但较复杂,推荐用 fetch/axios)
三十四、错误处理
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
// 成功
console.log(xhr.responseText);
} else {
// 错误处理
console.error('请求失败', xhr.status, xhr.statusText);
}
}
};
三十五、跨域与安全
- 同源策略:XHR 默认只能请求同源接口,跨域需服务器支持 CORS(响应头需有
Access-Control-Allow-Origin)。 - 凭证(Cookie):跨域时需设置
xhr.withCredentials = true,且后端需允许。
三十六、进阶用法
1. 设置超时
xhr.timeout = 5000; // 5秒超时
xhr.ontimeout = function() {
console.error('请求超时');
};
2. 取消请求
xhr.abort();
3. 监听进度(上传/下载)
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
var percent = (event.loaded / event.total) * 100;
console.log('上传进度: ' + percent + '%');
}
};
三十七、优缺点
优点
- 浏览器原生支持,兼容性极好(IE6+)。
- 可自定义请求细节。
缺点
- API 繁琐,需多步设置和回调。
- 不基于 Promise,嵌套多易形成回调地狱。
- 不如 fetch/axios 语法简洁,功能丰富。
三十八、与 fetch/axios 的区别
| 特点 | XMLHttpRequest | fetch | axios |
|---|---|---|---|
| API 风格 | 回调 | Promise | Promise |
| 语法简洁 | 否 | 是 | 是 |
| 默认 JSON 解析 | 否 | 需手动 response.json() | 自动解析 |
| 超时处理 | 有 timeout 属性 | 需配合 AbortController | 内置支持 |
| 拦截器 | 无 | 无 | 有 |
| 取消请求 | abort() | AbortController | CancelToken |
| 兼容性 | 全部主流浏览器 | IE 不支持 | 全部主流浏览器 |
三十九、总结
- XMLHttpRequest 是最基础的 AJAX 技术,适合了解原理或兼容旧浏览器的场景。
- 实际开发推荐使用 fetch 或 axios,代码更简洁且功能更强大。
- 学会 XHR,有助于理解 AJAX 的底层实现。
创作不易,点赞关注!!!
425

被折叠的 条评论
为什么被折叠?



