Z
ZHANK

Fetch API

掌握 fetch 请求、响应处理、请求配置

Fetch API

Fetch 是现代浏览器发起 HTTP 请求的标准方式,替代了老旧的 XMLHttpRequest。

学完本章你将: 掌握 GET/POST 请求、请求配置、响应处理。


基本用法

javascript
// GET 请求
fetch("https://jsonplaceholder.typicode.com/posts/1")
    .then(response => {
        if (!response.ok) throw new Error(`HTTP ${response.status}`);
        return response.json();
    })
    .then(data => console.log(data))
    .catch(err => console.error("请求失败:", err));

// async/await 版本
async function getPost(id) {
    let response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    return response.json();
}

请求配置

javascript
// POST 请求
async function createPost(data) {
    let response = await fetch("/api/posts", {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer token123",
        },
        body: JSON.stringify(data),
    });
    return response.json();
}

createPost({ title: "Hello", body: "World" });

// FormData 上传
async function uploadFile(file) {
    let formData = new FormData();
    formData.append("file", file);
    formData.append("name", file.name);

    let response = await fetch("/api/upload", {
        method: "POST",
        body: formData, // 自动设置 Content-Type 为 multipart/form-data
    });
    return response.json();
}

响应处理

javascript
async function handleResponse() {
    let response = await fetch("/api/data");

    console.log(response.status);      // 200
    console.log(response.ok);          // true(200-299)
    console.log(response.headers.get("content-type"));

    // 不同格式
    let json = await response.json();       // JSON
    let text = await response.text();       // 文本
    let blob = await response.blob();       // 二进制(图片等)
    let formData = await response.formData(); // FormData
    let buffer = await response.arrayBuffer(); // 原始二进制

    // 流式读取
    let reader = response.body.getReader();
    while (true) {
        let { done, value } = await reader.read();
        if (done) break;
        console.log("收到数据块:", value.length);
    }
}

中断请求

javascript
// AbortController
async function fetchWithAbort() {
    let controller = new AbortController();

    // 5秒后中断
    setTimeout(() => controller.abort(), 5000);

    try {
        let response = await fetch("/api/slow", {
            signal: controller.signal,
        });
        return response.json();
    } catch (err) {
        if (err.name === "AbortError") {
            console.log("请求已取消");
        }
    }
}