JavaScript Fetch API怎么用_它和AJAX有何不同?

2次阅读

Fetch API 是现代浏览器发起网络请求的标准方式,比 XMLhttpRequest 更简洁且基于 promise;需手动检查 response.ok 并调用 .json(),POST 需设置 headers 和 json.stringify(),默认不带 cookie,不支持超时和上传进度监听,IE 不兼容。

JavaScript Fetch API怎么用_它和AJAX有何不同?

Fetch API 是现代浏览器中发起网络请求的标准方式,用起来比传统 ajax(即 XMLHttpRequest)更简洁、更符合 Promise 语义。它不是 AJAX 的替代品,而是对 AJAX 思想的升级实现——核心目标一样:不刷新页面获取/提交数据,但写法、错误处理和默认行为差异明显。

Fetch 基本用法:从 GET 开始

最常见的是发一个 GET 请求获取 JSON 数据:

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

注意两点:fetch 不会因 HTTP 状态码报错(如 404、500),需手动检查 response.ok;它也不会自动解析 JSON,要显式调用 .json()

立即学习Java免费学习笔记(深入)”;

JavaScript Fetch API怎么用_它和AJAX有何不同?

短影AI

长视频一键生成精彩短视频

JavaScript Fetch API怎么用_它和AJAX有何不同? 170

查看详情 JavaScript Fetch API怎么用_它和AJAX有何不同?

发送 POST 请求并传 JSON 数据

发带数据的请求需要设置 methodheadersbody

fetch('https://jsonplaceholder.typicode.com/posts', {   method: 'POST',   headers: {     'Content-Type': 'application/json'   },   body: JSON.stringify({     title: '我的新文章',     body: '这是内容',     userId: 1   }) }) .then(res => res.json()) .then(data => console.log(data));

关键细节:必须手动设 Content-Type;JSON 数据要先 JSON.stringify();fetch 默认不带 Cookie,如需携带要加 credentials: 'include'

Fetch 和传统 AJAX(XMLHttpRequest)的主要区别

  • 语法风格不同:Fetch 基于 Promise,天然支持 async/await;XMLHttpRequest 是事件驱动(onload/onerror),回调嵌套易出错
  • 错误处理逻辑不同:Fetch 只在网络故障时 reject(如断网、dns 失败),HTTP 错误码(4xx/5xx)仍进 then;XMLHttpRequest 在状态码非 2xx 时也会触发 onerror 或需手动判断
  • 默认行为更“严格”:Fetch 默认不发 Cookie、不重定向(可配 redirect: 'follow'),而 XMLHttpRequest 默认跟随重定向、自动带 Cookie(同源时)
  • 流式读取支持更好:Fetch 的 response.body 是 Readablestream,适合处理大文件或实时数据;XMLHttpRequest 没有原生流支持

实际开发中要注意的坑

  • 没有超时控制:Fetch 本身不支持 timeout,需用 AbortController 手动中断
  • 不能直接上传进度:监听下载进度可用 response.body.getReader(),但上传进度需配合 FormData + XMLHttpRequest(目前仍是唯一通用方案)
  • IE 完全不支持:如需兼容 IE,必须引入 polyfill(如 whatwg-fetch)或退回 XMLHttpRequest
  • 重定向行为默认是 follow,但某些场景需禁用(比如想自己处理 302):配置 redirect: 'manual'

基本上就这些。Fetch 不复杂但容易忽略细节,用熟了比写一 new XMLHttpRequest() 清爽得多。

text=ZqhQzanResources