Skip to content

fetch API ​

WHATWG Fetch API,支持流式传输与分块传输解码。

全局对象 ​

全局对象类型描述
fetch(input, init?)function发起 HTTP 请求,返回 Promise<Response>
Headersclass不区分大小写的 HTTP 请求头容器
RequestclassHTTP 请求表示
ResponseclassHTTP 响应表示

fetch() ​

js
let response = await fetch('https://example.com/api/data', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ key: 'value' }),
    signal: controller.signal
});

参数 ​

参数类型描述
inputstring | RequestURL 或 Request 对象
init.methodstringHTTP 方法(默认:"GET")
init.headersHeaders | object | [string, string][]请求头
init.bodystring | null请求体
init.signalAbortSignal用于取消的中止信号

Response 对象 ​

js
let response = await fetch('https://example.com');

response.status;       // 200
response.statusText;   // "OK"
response.ok;           // true(状态码 200-299)
response.headers;      // Headers 实例
response.url;          // 请求 URL
response.type;         // "default"、"error"、"opaqueredirect"
response.body;         // ReadableStream 或 null
response.bodyUsed;     // 在消费之前为 false

// 消费响应体
let text = await response.text();
let json = await response.json();
let buffer = await response.arrayBuffer();

// 静态方法
let errResponse = Response.error();
let redirect = Response.redirect('https://other.com', 302);
let jsonResponse = Response.json({ ok: true });

Headers ​

js
let headers = new Headers();
headers.set('Content-Type', 'application/json');
headers.append('Accept', 'text/html');
headers.get('Content-Type');    // "application/json"
headers.has('Content-Type');    // true
headers.delete('Accept');

// 迭代
for (let [name, value] of headers) {
    console.log(name, value);
}

// 从对象构造
let h = new Headers({ 'X-Custom': 'value' });

// 从已有的 Headers 构造
let copy = new Headers(h);

// 从键值对数组构造
let fromPairs = new Headers([['Content-Type', 'text/plain']]);

流式响应 ​

响应体通过 ReadableStream 流式传输(当传输层支持流式时):

js
let response = await fetch('https://example.com/large-file');
let reader = response.body.getReader();

while (true) {
    let { done, value } = await reader.read();
    if (done) break;
    console.log('收到数据块:', value.length, '字节');
}

中止请求 ​

js
let controller = new AbortController();

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

try {
    let response = await fetch('https://slow-server.com', {
        signal: controller.signal
    });
} catch (err) {
    if (err.name === 'AbortError') {
        console.log('请求已被中止');
    }
}

错误处理 ​

js
try {
    let response = await fetch('https://invalid.url');
    if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${response.statusText}`);
    }
    let data = await response.json();
} catch (err) {
    if (err instanceof TypeError) {
        console.error('网络错误:', err.message);
    } else {
        console.error('其他错误:', err);
    }
}

注意事项 ​

  • 仅支持 HTTP/HTTPS 协议(不支持 file://、data://)
  • 重定向不会自动跟随——返回服务器发送的任何内容
  • 请求体始终以字符串形式发送(不支持 FormData 或 Blob 上传)
  • response.blob() 以文本形式返回响应体(Blob 类型尚未完全可用)
  • 请求头行最大长度为 4096 字节(实现限制)

MIT 许可证