fetch() 是 JavaScript 用于发送 HTTP 请求的内置 API,功能强大,语法简洁。以下是 fetch 的语法规则及常见用法。
1. fetch 基本语法
fetch(url, options)
.then(response => response.json()) // 解析 JSON 响应体
.then(data => console.log(data)) // 处理数据
.catch(error => console.error("Error:", error)); // 处理错误
url:请求的地址(必填)。options:可选的请求配置对象(如method、headers、body等)。
2. fetch 请求方法
(1)GET 请求
GET 请求用于获取数据,通常不需要 body:
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
或带参数:
const params = new URLSearchParams({ id: 123, name: "Tom" });
fetch(`https://api.example.com/data?${params}`)
.then(response => response.json())
.then(data => console.log(data));
(2)POST 请求
POST 用于发送数据,通常需要 body 和 headers:
fetch("https://api.example.com/data", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id: 123, name: "Tom" })
})
.then(response => response.json())
.then(data => console.log(data));
(3)PUT / PATCH 请求(更新数据)
PUT:完整更新资源PATCH:部分更新资源
fetch("https://api.example.com/user/123", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Updated Name" })
})
.then(response => response.json())
.then(data => console.log(data));
(4)DELETE 请求
DELETE 请求用于删除数据,通常不需要 body:
fetch("https://api.example.com/user/123", {
method: "DELETE"
})
.then(response => response.json())
.then(data => console.log(data));
3. fetch 选项(options)详解
fetch(url, {
method: "POST", // 请求方法
headers: { "Content-Type": "application/json" }, // 请求头
body: JSON.stringify({ key: "value" }), // 请求体
mode: "cors", // 跨域请求模式
credentials: "include", // 携带 Cookie
cache: "no-cache", // 缓存模式
redirect: "follow" // 自动跟随重定向
})
常用 options 配置
| 配置项 | 说明 |
|---|---|
method | 请求方法(GET、POST、PUT、DELETE、PATCH等) |
headers | 请求头,例如 Content-Type、Authorization 等 |
body | 发送的请求数据,通常为 JSON 或 FormData |
mode | cors(跨域),same-origin(同源) |
credentials | include(携带 Cookie),omit(不带 Cookie) |
cache | no-cache(不缓存),reload(强制刷新) |
redirect | follow(自动重定向),error(遇到重定向报错) |
4. 处理响应(Response 对象)
fetch 返回的是一个 Promise,解析后得到 Response 对象:
fetch("https://api.example.com/data")
.then(response => {
console.log(response.status); // HTTP 状态码
console.log(response.headers); // 响应头
return response.json(); // 解析 JSON
})
.then(data => console.log(data));
Response 方法
| 方法 | 作用 |
|---|---|
response.text() | 解析为文本格式 |
response.json() | 解析为 JSON |
response.blob() | 解析为 Blob(二进制数据,如图片) |
response.arrayBuffer() | 解析为 ArrayBuffer |
response.formData() | 解析为 FormData |
5. 处理错误
fetch 只有在网络错误时才会进入 catch,如果服务器返回 4xx 或 5xx 需要手动抛出异常:
fetch("https://api.example.com/data")
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error("Fetch error:", error));
6. async/await 方式
fetch 也可以和 async/await 搭配使用,使代码更清晰:
async function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Fetch error:", error);
}
}
fetchData();
7. 进阶用法
(1)携带 Cookie(跨域请求)
如果请求涉及跨域并需要携带 Cookie,必须设置 credentials:
fetch("https://api.example.com/data", {
method: "GET",
credentials: "include" // 允许携带 Cookie
});
(2)上传文件
使用 FormData 进行文件上传:
const formData = new FormData();
formData.append("file", fileInput.files[0]);
fetch("https://api.example.com/upload", {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => console.log(data));
(3)超时处理
fetch 本身不支持超时,需要用 Promise.race() 处理:
function fetchWithTimeout(url, timeout = 5000) {
return Promise.race([
fetch(url),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("Request Timeout")), timeout)
)
]);
}
fetchWithTimeout("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
8. 总结
| 用法 | 代码示例 |
|---|---|
| 基本 GET | fetch(url).then(res => res.json()).then(console.log); |
| POST 发送 JSON | fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }) |
| 处理错误 | fetch(url).then(res => { if (!res.ok) throw new Error(res.status); return res.json(); }) |
| 携带 Cookie | fetch(url, { credentials: "include" }) |
| 上传文件 | fetch(url, { method: "POST", body: formData }) |
| 超时处理 | Promise.race([fetch(url), new Promise((_, r) => setTimeout(() => r(new Error("Timeout")), 5000))]) |






![[ C语言 ] | 从0到1?](https://i-blog.csdnimg.cn/direct/13d60a32caec4649aefe75c708efe0ca.png)
![[Mac]利用Hexo+Github Pages搭建个人博客](https://i-blog.csdnimg.cn/direct/4cd015aa99d0421f8087b872b9ea6170.png)











