目录
什么是 AJAX?
工作原理
XMLHttpRequest 基础
现代 Fetch API
Axios 第三方库
数据处理
错误处理机制
跨域请求解决方案
最佳实践
总结
1. 什么是 AJAX?
AJAX(Asynchronous JavaScript and XML)是一种通过浏览器与服务器进行异步通信的技术,它允许:
在不刷新页面的情况下更新内容
实现局部页面刷新
提升用户体验和性能
核心优势:
传统请求 → 整页刷新(白屏等待)
AJAX 请求 → 局部更新(无缝交互)
2. 工作原理
用户触发事件(点击/滚动等)
创建 XMLHttpRequest 对象
向服务器发送请求
服务器处理请求
返回响应数据
客户端处理响应并更新 DOM
3. XMLHttpRequest 基础
3.1 基础用法
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
} else {
console.error('请求失败:', xhr.status);
}
}
};
xhr.send();
3.2 关键属性解析
属性/方法 | 说明 |
---|---|
readyState |
0-4 的请求状态码 |
status |
HTTP 状态码(200, 404等) |
responseType |
指定响应格式(json/blob等) |
setRequestHeader() |
设置请求头 |
4. 现代 Fetch API
4.1 基础用法
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) throw new Error('Network error');
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
.catch(error => console.error('Error:', error));
4.2 Async/Await 优化
async function loadData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
renderData(data);
} catch (error) {
showError(error.message);
}
}
5. Axios 第三方库
5.1 安装与基础使用
npm install axios
axios.get('/user?ID=12345')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
5.2 高级功能
// 全局配置
axios.defaults.baseURL = 'https://api.example.com';
// 拦截器
axios.interceptors.request.use(config => {
config.headers.Authorization = `Bearer ${token}`;
return config;
});
6. 数据处理
6.1 JSON 处理
// 自动解析
const response = await fetch(url);
const data = await response.json();
// 手动处理
xhr.responseType = 'json';
xhr.onload = () => console.log(xhr.response);
6.2 表单提交
const formData = new FormData(document.getElementById('myForm'));
fetch('/submit', {
method: 'POST',
body: formData
});
7. 错误处理机制
7.1 通用错误处理
function handleErrors(response) {
if (!response.ok) {
throw new Error(`HTTP错误 ${response.status}`);
}
return response;
}
fetch(url)
.then(handleErrors)
.then(/* 处理正常响应 */)
.catch(/* 处理所有错误 */);
7.2 超时处理
// Fetch + AbortController
const controller = new AbortController();
setTimeout(() => controller.abort(), 5000);
fetch(url, { signal: controller.signal })
.catch(err => {
if (err.name === 'AbortError') {
console.log('请求超时');
}
});
8. 跨域请求解决方案
8.1 CORS 配置
// 服务器端设置
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST
8.2 开发环境代理
// webpack.config.js
module.exports = {
devServer: {
proxy: {
'/api': 'http://localhost:3000'
}
}
}
9. 最佳实践
性能优化
使用请求节流(throttle)
实现加载状态提示
缓存频繁访问的数据
安全防护
验证和过滤用户输入
使用 CSRF Token
axios.defaults.headers.common['X-CSRF-TOKEN'] = token;
代码规范
统一封装请求模块
使用 ES6+ 语法
添加必要的注释
10. 总结
技术选型建议:
简单请求 → 使用原生
fetch()
复杂项目 → 选择
Axios
旧浏览器支持 →
XMLHttpRequest
学习路线:
掌握同源策略和 CORS
熟练使用开发者工具网络面板
学习 RESTful API 设计规范
扩展阅读: