JavaScript 词条目录
前端Wiki/JavaScript/深入/异步编程

fetch 网络请求

fetch 是浏览器内置的请求接口,不用装任何库。基本用法:传入 URL 返回 Promise,拿到响应后调用 res.json() 把响应体解析成 JS 对象(这也是个异步操作,要再 await 一次)。

一个必须知道的大坑:fetch 只有网络层失败(断网、DNS 解析失败)才会 reject,404、500 这类 HTTP 错误照样走 then。所以要手动检查 res.ok(状态码 200~299)或 res.status,不 OK 就主动 throw,让错误进入 catch。

POST 请求通过第二个参数配置:method 设为 POST,headers 声明内容类型,body 传 JSON.stringify(数据)。实际项目常用 axios 等库封装拦截器,但 fetch 的这些概念是共通的。

本节要点fetch 两步走:先 await fetch 拿响应,再 await res.json() 解析;404/500 不会自动抛错,必须检查 res.ok;POST 用第二参数配置 method/headers/body。
JavaScript
// GET:获取数据
async function loadTodo() {
  try {
    const res = await fetch(
      'https://jsonplaceholder.typicode.com/todos/1'
    );
    if (!res.ok) {                    // 404/500 不会自动抛错!
      throw new Error('HTTP 错误:' + res.status);
    }
    const data = await res.json();    // 解析响应体为对象
    console.log('标题:' + data.title);
    console.log('完成了吗:' + data.completed);
  } catch (err) {
    // 断网、DNS 失败、手动 throw 的错误都会到这里
    console.log('请求失败:' + err.message);
  }
}
loadTodo();

// POST:提交数据
async function saveTodo() {
  const res = await fetch('https://jsonplaceholder.typicode.com/todos', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ title: '学习 fetch', completed: false }),
  });
  console.log('服务器返回:', await res.json());
}
// saveTodo();