前言
本文是AJAX系列的第二篇,深入讲解Axios的五种请求方法(GET/POST/PUT/PATCH/DELETE)、全局配置、跨域解决方案(JSONP与CORS),并通过一个完整的列表管理系统实战案例串联所有知识点。掌握这些内容,你将能够独立完成前后端数据交互的增删改查操作。
一、Axios基础回顾
1.1 引入Axios
<script src="../js/axios.js"></script>
1.2 三种请求处理方式
|
Promise链式调用 |
.then().catch() |
简单的异步处理 |
|
回调函数形式 |
.then(成功回调, 失败回调) |
需要分别处理成功和失败 |
|
async/await |
try{ await } catch(error){} |
推荐,代码最简洁 |
// 方式一:Promise链式调用
axios.get("http://localhost:3002/user")
.then((res) => { console.log(res.data); })
.catch((err) => { console.log(err.message); });
// 方式二:回调函数形式
axios.get("http://localhost:3002/user").then(
(res) => { console.log(res.data); },
(err) => { console.log(err); }
);
// 方式三:async/await(推荐)
async function getData() {
try {
let res = await axios.get("http://localhost:3002/user");
console.log(res.data);
} catch (error) {
console.log(error);
}
}
二、Axios五种请求方法详解
2.1 GET请求 — 获取数据
// 基本请求
let res = await axios.get("http://localhost:3001/list");
// 带参数查询 – 方式一:URL拼接
let res = await axios.get("http://localhost:3001/list?name=孙悟空");
// 带参数查询 – 方式二:params对象(推荐)
let res = await axios.get("http://localhost:3001/list", {
params: {
id: 4
}
});
2.2 POST请求 — 新增数据
let obj = {
id: +new Date(), // 使用时间戳作为唯一ID
name: this.inp.value,
age: 2000,
address: "待定"
};
await axios.post("http://localhost:3001/list", obj);
2.3 PUT请求 — 完整更新
PUT请求会用新数据完全替换旧数据,未指定的字段会被清空。
// 更新id为1的记录,只保留name字段
await axios.put("http://localhost:3001/list/1", {
name: this.inpEdit.value
});
2.4 PATCH请求 — 部分更新
PATCH请求只更新指定的字段,其他字段保持不变。
// 更新id为2的记录,只修改name字段
axios.patch("http://localhost:3001/list/2", {
name: this.inpEdit.value
});
2.5 DELETE请求 — 删除数据
let id = this.inpDel.value;
axios.delete(`/list/${id}`);
2.6 五种方法对比
|
GET |
获取数据 |
❌ 无 |
✅ 是 |
查询列表、详情 |
|
POST |
新增数据 |
✅ 有 |
❌ 否 |
添加新记录 |
|
PUT |
完整更新 |
✅ 有 |
✅ 是 |
替换整条记录 |
|
PATCH |
部分更新 |
✅ 有 |
✅ 是 |
修改部分字段 |
|
DELETE |
删除数据 |
❌ 无 |
✅ 是 |
删除记录 |
三、Axios全局配置
3.1 基本配置项
// 配置全局的超时时长(单位:毫秒)
axios.defaults.timeout = 2000;
// 配置全局的基本URL
axios.defaults.baseURL = "http://localhost:3001";
3.2 使用全局配置后的请求
配置baseURL后,请求路径可以简写为相对路径。
// 配置前
await axios.get("http://localhost:3001/list");
await axios.post("http://localhost:3001/list", obj);
// 配置后(简写)
await axios.get("/list");
await axios.post("/list", obj);
3.3 全局配置的优势
|
减少重复代码 |
所有请求共享baseURL和timeout |
|
便于维护 |
修改API地址只需改一处 |
|
统一管理 |
超时时间、请求头等全局生效 |
四、跨域解决方案
4.1 同源策略
同源策略(Same-Origin Policy)最早由Netscape公司提出,是浏览器的一种安全策略。
|
同源定义 |
协议、域名、端口号三者完全相同 |
|
跨域 |
违背同源策略就是跨域 |
|
目的 |
保护用户数据安全,防止恶意网站窃取数据 |
4.2 JSONP原理
JSONP利用<script>标签天然支持跨域的特性来实现跨域请求。
实现原理:
客户端 服务器
│ │
│ 创建<script>标签 │
│ 设置src为跨域URL │
│ ──────────────────────► │
│ │
│ 返回: handleData({"name":"jack"}) │
│ ◄────────────────────── │
│ │
│ 执行handleData函数 │
│ 处理返回的数据 │
客户端实现:
// 客户端定义处理函数
function handleData(data) {
console.log(data); // 处理服务器返回的数据
}
// 创建script标签发起请求
const script = document.createElement("script");
script.src = "http://127.0.0.1:8000/check-username";
document.body.appendChild(script);
JSONP特点:
|
支持方式 |
只支持GET请求 |
|
兼容性 |
兼容所有浏览器 |
|
安全性 |
容易受到XSS攻击 |
|
现代替代 |
CORS是更好的选择 |
4.3 CORS(跨域资源共享)
CORS是W3C标准,通过在服务器端设置响应头来实现跨域。
客户端实现(无需特殊处理):
const xhr = new XMLHttpRequest();
xhr.open("GET", "http://127.0.0.1:8000/cors-server");
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300) {
res.innerHTML = xhr.response;
}
};
服务器端需要设置的响应头:
// Node.js Express示例
res.setHeader("Access-Control-Allow-Origin", "*");
4.4 JSONP vs CORS
|
请求方式 |
仅GET |
所有HTTP方法 |
|
实现难度 |
客户端需特殊处理 |
客户端无需处理 |
|
浏览器兼容 |
全兼容 |
IE10+ |
|
安全性 |
较低(XSS风险) |
较高 |
|
现代推荐 |
❌ 不推荐 |
✅ 推荐 |
五、实战案例:列表管理系统
5.1 类结构设计
class List {
// 元素获取
listOuter = document.querySelector(".listOuter");
inp = document.getElementById("inp");
addBtn = document.getElementById("add");
// 数据管理
mylist = [];
constructor() {
this.getData();
this.addEvent();
}
// 事件绑定
addEvent() {
this.addBtn.addEventListener("click", this.addFun.bind(this));
}
// 数据渲染
gender(mylist) {
let str = "";
mylist.forEach((item) => {
str += `<li>${item.name}<a href="#">删除</a></li>`;
});
this.listOuter.innerHTML = str;
}
// 数据获取
async getData() {
try {
let res = await axios.get("/list");
this.mylist = res.data;
this.gender(this.mylist);
} catch (error) {
console.log(error);
}
}
}
5.2 功能实现要点
|
数据绑定 |
保持this上下文正确 |
bind(this) |
|
异步处理 |
统一使用async/await |
try-catch包裹 |
|
错误处理 |
捕获并打印错误 |
console.log(error) |
|
实时更新 |
操作后重新获取数据 |
调用getData() |
5.3 完整CRUD操作
class List {
// … 上述代码 …
// 新增数据
async addFun() {
try {
let obj = {
id: +new Date(),
name: this.inp.value,
age: 2000,
address: "待定"
};
await axios.post("/list", obj);
this.getData(); // 重新获取数据
} catch (error) {
console.log(error);
}
}
// 删除数据
async delFun(id) {
try {
await axios.delete(`/list/${id}`);
this.getData(); // 重新获取数据
} catch (error) {
console.log(error);
}
}
// 更新数据(完整更新)
async updateFun(id, newName) {
try {
await axios.put(`/list/${id}`, {
name: newName
});
this.getData(); // 重新获取数据
} catch (error) {
console.log(error);
}
}
// 部分更新
async patchFun(id, field) {
try {
await axios.patch(`/list/${id}`, field);
this.getData(); // 重新获取数据
} catch (error) {
console.log(error);
}
}
}
六、注意事项与最佳实践
6.1 请求方法选择指南
|
查询数据 |
GET |
获取列表或详情 |
|
新增数据 |
POST |
添加新记录 |
|
完整更新 |
PUT |
替换整条记录 |
|
部分更新 |
PATCH |
修改部分字段 |
|
删除数据 |
DELETE |
删除记录 |
6.2 跨域解决方案选择
|
简单GET请求 |
CORS |
功能完整,安全性高 |
|
需要兼容IE |
JSONP |
唯一选择 |
|
生产环境 |
CORS |
现代浏览器标配 |
|
开发调试 |
代理转发 |
无需后端配合 |
6.3 错误处理规范
// ✅ 推荐的错误处理方式
try {
let res = await axios.get("/list");
// 处理成功数据
} catch (error) {
// 统一错误处理
console.error("请求失败:", error.message);
alert("数据加载失败,请稍后重试");
}
6.4 性能优化建议
|
全局配置 |
设置baseURL和timeout,减少重复代码 |
|
合理超时 |
根据接口响应速度设置合适的超时时间 |
|
错误提示 |
给用户友好的错误反馈 |
|
数据缓存 |
对于不频繁变动的数据,考虑本地缓存 |
总结
本文系统梳理了AJAX第二部分的完整知识体系:
|
Axios五种方法 |
GET查询、POST新增、PUT完整更新、PATCH部分更新、DELETE删除 |
|
全局配置 |
baseURL统一管理、timeout超时控制 |
|
跨域解决方案 |
JSONP(仅GET、兼容老浏览器)、CORS(推荐、功能完整) |
|
列表管理系统 |
面向对象封装、CRUD操作、数据实时更新 |
掌握这些内容,你就具备了完整的前后端数据交互能力,能够独立完成增删改查功能的开发。欢迎持续关注本系列更多进阶内容!
网硕互联帮助中心


评论前必须登录!
注册