Fetch API 详解

Fetch API 详解

Fetch API 是现代 JavaScript 中用于发起网络请求的标准 API,它比传统的 XMLHttpRequest 更强大、更灵活,且基于 Promise 实现。

基本语法

javascript 复制代码
fetch(resource [, init])
  .then(response => {
    // 处理响应
  })
  .catch(error => {
    // 处理错误
  });

参数说明

  1. resource: 请求的资源路径(URL)

  2. init (可选): 配置对象,可以包含以下属性:

    • method: 请求方法(GET, POST, PUT, DELETE等)
    • headers: 请求头信息
    • body: 请求体数据
    • mode: 请求模式(cors, no-cors, same-origin)
    • credentials: 是否发送 cookies(include, same-origin, omit)
    • cache: 缓存模式
    • redirect: 重定向处理方式
    • referrer: 引用来源
    • signal: AbortSignal 用于取消请求

常见请求示例

1. GET 请求

javascript 复制代码
fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('网络响应不正常');
    }
    return response.json();
  })
  .then(data => console.log(data))
  .catch(error => console.error('请求失败:', error));

2. POST 请求

javascript 复制代码
fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token'
  },
  body: JSON.stringify({
    name: 'John',
    age: 30
  })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

3. 上传文件

javascript 复制代码
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(result => console.log('上传成功:', result))
.catch(error => console.error('上传失败:', error));

响应处理

Fetch API 返回的 Response 对象包含以下常用属性和方法:

属性

  • ok: 布尔值,表示请求是否成功(状态码 200-299)
  • status: HTTP 状态码
  • statusText: 状态文本
  • headers: 响应头信息
  • url: 请求的 URL

方法

  • json(): 解析响应体为 JSON
  • text(): 获取响应体文本
  • blob(): 获取响应体为 Blob 对象
  • formData(): 获取响应体为 FormData 对象
  • arrayBuffer(): 获取响应体为 ArrayBuffer

错误处理

Fetch API 的错误处理需要注意:

  1. 网络错误(如无法连接)会触发 catch
  2. HTTP 错误状态(如 404, 500)不会触发 catch,需要检查 response.ok
javascript 复制代码
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('请求出现问题:', error));

高级用法

1. 设置超时

javascript 复制代码
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);

fetch('https://api.example.com/data', {
  signal: controller.signal
})
.then(response => {
  clearTimeout(timeoutId);
  return response.json();
})
.catch(error => {
  if (error.name === 'AbortError') {
    console.log('请求超时');
  } else {
    console.error('其他错误:', error);
  }
});

2. 并发请求

javascript 复制代码
Promise.all([
  fetch('https://api.example.com/data1'),
  fetch('https://api.example.com/data2')
])
.then(responses => Promise.all(responses.map(res => res.json())))
.then(data => {
  console.log('数据1:', data[0]);
  console.log('数据2:', data[1]);
})
.catch(error => console.error('请求失败:', error));

3. 自定义请求拦截

javascript 复制代码
// 请求拦截器
const originalFetch = window.fetch;
window.fetch = async (...args) => {
  console.log('发起请求:', args[0]);
  // 可以在这里添加认证token等
  const response = await originalFetch(...args);
  console.log('收到响应:', response);
  return response;
};

注意事项

  1. Fetch 默认不会发送或接收 cookies,需要设置 credentials: 'include'
  2. 错误状态码(如 404, 500)不会触发 catch,需要检查 response.ok
  3. Fetch 不支持直接监控上传/下载进度(可以使用 XMLHttpRequest 替代)
  4. 在 Node.js 环境中,需要使用 node-fetch 或类似 polyfill

Fetch API 提供了强大而灵活的网络请求能力,是现代 Web 开发中处理 HTTP 请求的首选方式。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端