Fetch API如何获取JSON数据?,常见错误有哪些?

fetch API 是浏览器原生提供的 HTTP 请求工具,处理 JSON 数据时,它比传统 XMLHttpRequest 更简洁,也比第三方库如 axios 更轻量,基于 Promise 的设计让异步代码更易读。参考2

下面系统地拆解 fetch 与 JSON 结合的基础用法、技术选型、跨域方案以及实战技巧。

HTTP 发送接收JSON数据
加载中
HTTP 发送接收JSON数据

fetch api json 怎么用?从基础语法到数据解析

基础语法:fetch(url, options) 与 Promise 链

fetch 的第一个参数是 URL,第二个是可选的配置对象,它返回一个 Promise,resolve 时拿到 Response 对象,要获取 JSON 数据,需要调用 response.json(),这个方法也返回 Promise。

  • 最简单的 GET 请求:fetch('https://api.example.com/data') 然后链式 .then(res => res.json()) .then(data => console.log(data))。
  • 使用 async/await:const res = await fetch(url); const data = await res.json();。
  • 配置对象常见选项:method、headers、body、mode、credentials、cache、signal 等。

fetch api json 请求本地json文件示例

在开发中,常常需要请求本地静态 JSON 文件,只要文件放在项目的 public 目录下,直接用相对路径即可:

fetch('./data.json')
  .then(res => res.json())
  .then(data => console.log(data));

这种方式不存在跨域问题,非常适合快速测试和数据加载。

发送 JSON 数据:POST 请求中的 Content-Type 设置

当提交 JSON 数据时,必须设置 method 为 POST,headers 包含 'Content-Type': 'application/json',body 是 JSON.stringify 后的字符串。

fetch('https://api.example.com/submit', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: '李四', age: 25 })
});

很多新手忘记设置 Content-Type 或忘记序列化,导致后端收到空对象或解析错误,这是最常见的坑之一。

解析 JSON 响应:response.json() 的正确用法

response.json() 读取响应体并解析为 JSON,如果响应不是合法 JSON,会抛出 SyntaxError,所以建议先检查 response.ok 或 status。

  • 检查 response.ok:如果为 false,可以 throw 一个错误或进入错误处理。
  • 常见做法:封装一个统一的请求函数,内部处理这些检查和错误。

封装一个通用的 fetch 请求函数

在实际项目中,我们通常不会直接使用裸 fetch,而是封装一个函数,统一处理请求头、错误、超时、JSON 解析等。

async function request(url, options = {}) {
  const controller = new AbortController();
  const timeout = options.timeout || 5000;
  const timeou

Fetch API如何获取JSON数据?,常见错误有哪些?

tId = setTimeout(() => controller.abort(), timeout); try { const res = await fetch(url, { ...options, signal: controller.signal, headers: { 'Content-Type': 'application/json', ...options.headers }, }); if (!res.ok) throw new Error(`HTTP error ${res.status}`); return await res.json(); } catch (err) { if (err.name === 'AbortError') throw new Error('请求超时'); throw err; } finally { clearTimeout(timeoutId); } }

这样,每次调用 request('https://api.example.com/data') 就能得到 JSON 数据,并自动处理超时和 HTTP 错误。

fetch api json 和 axios 哪个更适合你的项目

语法简洁性对比

fetch 是原生 API,无需额外安装,但处理 JSON 需要手动转换,axios 提供了自动 JSON 转换、拦截器、请求取消等高级功能,代码更简洁。

特性 fetch axios
自动 JSON 转换 需要手动调用 .json() 自动
请求取消 通过 AbortController 内置 CancelToken
拦截器 不支持,需自行封装 支持
浏览器兼容性 现代浏览器,IE 不支持 需 polyfill,但兼容性更好

从代码量看,axios 在复杂场景下更简洁,fetch 在简单场景下更轻量,行业共识认为,在可控的现代浏览器环境中,fetch 是趋势;但在需要兼容旧浏览器或高级功能时,axios 仍是稳妥选择。参考2

错误处理机制差异

fetch 只在网络故障时 reject,对 HTTP 错误状态码(如 404、500)会 resolve,但 response.ok 为 false,所以你需要手动检查状态码,而 axios 对非 2xx 状态码自动 reject,错误处理更统一。

  • 在 fetch 中,建议统一检查 response.ok,如果不 ok 则 throw 或调用错误处理函数。
  • 也可以使用拦截器模式(自己封装)来统一处理错误。

社区生态与学习成本

axios 有庞大的社区和丰富的插件,学习曲线平缓,fetch 作为标准 API,学习成本低,但需要自己封装一些功能,从实际项目来看,如果你希望代码更标准、更未来,fetch 是更好的选择;如果你希望开箱即用、减少样板代码,axios 更高效。

应用场景选择建议

  • 轻量项目:只发几个请求,追求零依赖,选 fetch。
  • 复杂项目:大量请求,需要拦截器、全局错误处理、请求取消、上传进度等,选 axios 更高效。
  • 在 Node.js 环境中,axios 支持更早,fetch 需要额外库或等待 Node 18+。

fetch api json 跨域问题怎么解决

CORS 跨域资源共享配置

Fetch API如何获取JSON数据?,常见错误有哪些?

当请求跨域资源时,浏览器会先发送 OPTIONS 预检请求,服务器需返回正确的 CORS 头,如 Access-Control-Allow-Origin,fetch 默认不带凭据,如果需要携带 cookies,要设置 credentials: 'include'。

  • 服务器端设置 Access-Control-Allow-Origin: 或具体域名。
  • 对于需要 cookies 的请求,服务器还需设置 Access-Control-Allow-Credentials: true,且 Origin 不能为 。
  • fetch 的 mode 选项默认是 ‘cors’,也可以设置为 ‘no-cors’ 但只能发送简单请求,且响应不可读。

开发环境代理方案

在开发阶段,通过配置构建工具代理来绕过 CORS 是最常用的方法,在 Vite 的 vite.config.js 中设置:

server: {
  proxy: {
    '/api': 'https://api.example.com'
  }
}

这样,前端请求 /api/xxx 会被代理到 https://api.example.com/xxx,避免跨域,业内专家指出,这是开发中最实用的跨域解决方案。

生产环境跨域解决方案

在生产环境中,通常通过配置 Nginx 反向代理或使用 API 网关来解决跨域,Nginx 配置:

location /api/ {
  proxy_pass https://api.example.com/;
  proxy_set_header Host $host;
}

这样,前端请求同域下的 /api/ 就会被代理到后端,规避跨域问题。

JSONP 的局限与 fetch 替代方案

JSONP 只能用于 GET 请求,且有安全风险,现在已不推荐使用,如果后端不支持 CORS,可以考虑自建代理服务,或者使用 postMessage 与 iframe 通信,fetch 配合 CORS 是标准做法。

fetch api json 实战技巧与常见踩坑

请求超时控制:AbortController 的使用

fetch 原生不支持超时,但可以通过 AbortController 实现。

const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
fetch(url, { signal: controller.signal })
  .then(res => res.json())
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('请求超时');
    }
  })
  .finally(() => clearTimeout(timeoutId));

请求重试机制

当请求失败时,可以自动重试几次,在 catch 中判断错误类型,如果是网络错误或超时,则重新发起请求,最多重试 3 次。

async function requestWithRetry(url, options, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      return await request(url, options);
    } catch (err) {
      if (i === retries - 1) throw err;
      // 等待一段时间再重试
      await new Promise(r => setTimeout(r, 1000  (i + 1)));
    }
  }
}

并发请求:Promise.all 与 fetch 结合

Fetch API如何获取JSON数据?,常见错误有哪些?参考2

当需要同时请求多个接口时,可以使用 Promise.all 或 Promise.allSettled,注意,如果其中一个请求失败,Promise.all 会整体 reject,所以根据场景选择。

  • 需要所有请求成功才继续:用 Promise.all。
  • 需要每个请求结果独立处理:用 Promise.allSettled。

取消重复请求

在搜索框等场景中,需要取消上一次未完成的请求,只保留最新一次,可以使用 AbortController 结合 Map 来管理。

const pendingRequests = new Map();
function getRequestKey(url, options) {
  return url + JSON.stringify(options);
}
async function fetchWithCancel(url, options) {
  const key = getRequestKey(url, options);
  if (pendingRequests.has(key)) {
    pendingRequests.get(key).abort();
  }
  const controller = new AbortController();
  pendingRequests.set(key, controller);
  try {
    const result = await fetch(url, { ...options, signal: controller.signal });
    return await result.json();
  } finally {
    pendingRequests.delete(key);
  }
}

这样,在连续输入时,前面的请求会被取消,只执行最后一次。

兼容性处理:polyfill 与降级方案

现代浏览器普遍支持 fetch,但 IE 和一些老旧浏览器不支持,可以使用 whatwg-fetch 或 unfetch 等 polyfill,在引入 polyfill 后,fetch 在旧浏览器中也能工作,据统计,现代浏览器对 fetch 的支持已经相当广泛,但在一些老旧环境中仍需 polyfill 来降级。

fetch API 处理 JSON 不仅简洁高效,而且随着浏览器支持越来越广,它已经成为前端开发中不可或缺的技能,掌握它的基础用法和常见陷阱,能让你在项目中更从容地处理数据请求,无论是简单的 GET 请求,还是复杂的 POST 与跨域场景,fetch 都能胜任,关键是要理解它的设计哲学和边界情况。

fetch api json 常见问题与解答

问题1:fetch 请求 JSON 时,怎么处理网络错误和 HTTP 错误?

fetch 只在网络故障时 reject,所以需要在 .then 中检查 response.ok,ok 为 false,则 throw 或进入错误处理分支,在 .catch 中处理网络错误,建议封装一个统一的请求函数,内部处理这些逻辑。

问题2:fetch 上传 JSON 时,为什么后端总是收到空对象?

大多数情况下是因为忘记设置 Content-Type 为 application/json,或者 body 没有用 JSON.stringify 转换,确保头部正确,body 是字符串,后端就能正常解析。

问题3:fetch 在 Node.js 环境中怎么用?

Node.js 原生不支持 fetch,但可以使用 node-fetch 或 undici 等库,或者等待 Node.js 18+ 的原生 fetch 支持,在 Node.js 中,fetch 的用法与浏览器一致,但不存在跨域问题,且无需处理 CORS。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/fetch-api%e5%a6%82%e4%bd%95%e8%8e%b7%e5%8f%96json%e6%95%b0%e6%8d%ae%ef%bc%9f%ef%bc%8c%e5%b8%b8%e8%a7%81%e9%94%99%e8%af%af%e6%9c%89%e5%93%aa%e4%ba%9b%ef%bc%9f/

赞 (0)
服务器2G内存条适合安装哪些操作系统,多少钱
上一篇 2026年7月30日 05:48
房产网站推广有哪些常见方法,怎么做才能快速见效?
下一篇 2026年7月30日 05:57

相关推荐

  • 服务器证书申请流程是什么?,需要多少钱?

    服务器证书申请的核心步骤包括生成CSR、选择CA机构、验证域名所有权和安装证书,整个过程通常在一到三天内完成, 随着HTTPS全面普及,服务器证书申请已成为网站上线前的必要环节,无论你运营个人博客还是企业官网,掌握申请流程能让你快速实现安全加密,避免因证书问题导致用户信任下降,服务器证书申请流程:从生成CSR到……

    2026年7月29日
    1500
  • 云服务器哪家好恒创怎么样,哪个牌子性价比高

    云服务器哪家好恒创?如果你的业务偏向国内访问、需要高性价比的独立IP和CN2线路,恒创科技是一个值得认真考虑的选项,尤其是中小企业和个人开发者,往往能在恒创找到比一线大厂更划算的配置方案,恒创云服务器怎么样,先看它的真实定位很多人在搜索“云服务器哪家好恒创”时,其实心里已经对恒创有了一定了解,只是想确认它是否靠……

    2026年10月16日
    100
  • JS如何动态获取表格列宽?js获取table宽度方法

    关于js操作获取表格列宽在构建企业级数据后台、ERP系统或复杂的SaaS管理平台时,前端表格组件的性能与交互体验直接决定了用户的工作效率,当面对动态数据源、自适应布局以及复杂的DOM结构时,单纯依赖CSS或后端渲染往往难以满足精细化控制的需求,利用JavaScript精准获取并动态调整表格列宽,成为提升页面加载……

    2026年6月13日
    5400
  • 极路由插件开发怎么做,,极路由插件开发难吗?

    极路由插件开发的核心在于构建符合OpenWrt架构的轻量级嵌入式应用,通过Lua脚本与Shell命令的结合,实现对路由器底层网络功能的深度定制与扩展,这一过程不仅要求开发者具备Linux系统编程基础,还需要深入理解路由器的文件系统结构、UCI配置系统以及特定的Web交互协议,开发环境搭建与工具链准备进行极路由插……

    2026年2月27日
    13300
  • 浩航互联云服务器密码怎么找回,云服务器初始密码怎么查看?

    浩航互联云服务器密码是登录实例的唯一凭证,忘记密码时不需要重装系统,通过控制台重置功能即可恢复访问;重置完成后必须重启实例,新密码才会生效,浩航互联云服务器密码重置流程控制台重置的具体操作登录浩航互联官网,进入用户控制台,在实例列表中找到对应的云服务器,确认地域和实例ID,点击实例名称进入详情页,找到“重置密码……

    2026年10月10日
    000
  • Java图形控件是什么?Java图形界面开发常用控件有哪些

    关于java图形控件在构建企业级Java应用时,开发者往往面临一个核心痛点:如何在保持后端逻辑纯净的同时,实现高效、稳定且具备良好交互体验的前端界面展示,虽然Java Swing和JavaFX是传统的桌面端图形解决方案,但在现代Web服务器架构中,“Java图形控件”的概念已演变为后端数据驱动的前端可视化组件库……

    2026年6月15日
    4700
  • 百度云开发视频教程在哪找?零基础入门到精通全套合集

    掌握百度云开发的核心在于系统化的视频学习与实战演练,通过高质量的教程指引,开发者能够快速跨越服务器运维的技术门槛,直接聚焦业务逻辑的实现,从而显著提升应用开发的效率与稳定性,百度云开发视频教程的价值不仅在于技术知识的传递,更在于构建一套从零到一的云端工程化思维,帮助开发者在无服务器的架构下实现降本增效, 为何选……

    2026年4月11日
    6900
  • ftp服务器文件能直接打开吗,怎么打开文件?

    FTP服务器上的文件能否直接打开,取决于浏览器支持、文件类型以及服务器配置;在主流浏览器取消FTP支持后,需通过HTTP中转或FTP客户端实现无感预览,FTP服务器文件直接打开方法浏览器直接打开FTP文件的条件过去在地址栏输入ftp://就能浏览目录并打开文件,但近年来Chrome、Firefox等主流浏览器逐……

    2026年7月22日
    4200
  • 在开发区做什么好?开发区创业什么项目最赚钱?

    在开发区创业或投资,首选方向应当聚焦于产业链配套服务、现代物流仓储、高新技术配套以及生活性服务业,这四大领域不仅契合开发区天然的产业集聚优势,而且具备需求稳定、客户集中、现金流快的特征,是风险相对可控且回报周期合理的优选赛道, 深耕产业链配套,做企业的“后勤部”开发区通常是工业企业的聚集地,这些企业的核心精力集……

    2026年3月24日
    10800
  • 三星开发者选项找不到怎么办?三星手机开发者选项在哪里打开

    三星手机开发者选项找不到的根本原因在于系统默认将其隐藏,这是安卓系统为了防止普通用户误操作而设置的底层保护机制,只需通过特定的“激活代码”即可让其永久显示,该过程安全且可逆,不会影响手机保修,核心解决方案:连续点击版本号这是解决“三星开发者选项找不到”问题的唯一标准且通用的方法,适用于几乎所有三星One UI版……

    2026年3月18日
    17700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注