JavaScript中如何用fetch发送网络请求

在写网页的时候,经常要从服务器拿数据,比如加载一篇文章、提交一个表单、或者实时查看天气。以前大家常用 XMLHttpRequest,现在有了更简洁的方式——fetch。它原生支持 Promise,写起来更顺手,也更容易理解。

fetch 是什么

fetch 是浏览器提供的一个全局方法,用来发起网络请求。它返回一个 Promise,可以配合 async/await 使用,让异步代码看起来更像同步操作。不像老式写法那样嵌套回调,逻辑清晰不少。

最简单的 GET 请求

比如你想从某个接口获取用户信息,可以直接用 fetch 调用:

fetch('/api/user')
  .then(response => response.json())
  .then(data => console.log(data));

这段代码会向 /api/user 发起 GET 请求,拿到响应后转成 JSON,最后打印出来。整个过程非阻塞,不会卡住页面。

用 async/await 写更清爽

如果你习惯用 async 函数,可以这样写:

async function getUser() {
  const response = await fetch('/api/user');
  const data = await response.json();
  console.log(data);
}

看起来就像一步步执行,调试时也方便跟踪每一步的结果。

发送 POST 请求传数据

提交登录表单时通常用 POST。fetch 也能轻松处理:

async function login() {
  const response = await fetch('/api/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: 'john',
      password: '123456'
    })
  });

  if (response.ok) {
    const result = await response.json();
    console.log('登录成功', result);
  } else {
    console.log('登录失败');
  }
}

这里设置了请求方法、头信息和请求体。注意 Content-Type 要设对,不然后端可能解析不了。

别忘了处理网络异常

网络不是 always 可靠的,用户可能断网,服务器也可能抽风。所以最好加上 try-catch:

async function fetchData() {
  try {
    const response = await fetch('/api/data');
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('请求出错:', error);
  }
}

这样即使网络断了或者接口挂了,也不会让整个页面崩溃,还能给用户提示。

实际场景:加载新闻列表

假设你做个个人博客,首页要显示最新几条文章。可以用 fetch 从 /api/posts 拿数据:

async function loadPosts() {
  const container = document.getElementById('posts');

  try {
    const response = await fetch('/api/posts');
    const posts = await response.json();

    posts.forEach(post => {
      const div = document.createElement('div');
      div.innerHTML = `<h3>${post.title}</h3><p>${post.summary}</p>`;
      container.appendChild(div);
    });
  } catch (err) {
    container.innerHTML = '<p>加载失败,请稍后重试</p>';
  }
}

// 页面加载完自动执行
loadPosts();

这样一来,打开页面就能动态加载内容,不用刷新也能更新信息。

小细节要注意

fetch 默认不带 cookie,如果接口依赖登录状态,记得加 credentials 选项:

fetch('/api/profile', {
  credentials: 'include'
});

另外,跨域问题还是得后端配合设置 CORS,光前端改没用。

现在主流浏览器都支持 fetch,IE 不行,但如果你不维护老项目,基本可以放心用。它比以前的方案更现代、更简洁,写前端绕不开这一块。