浏览器 API 【详解】fetch
fetch是浏览器原生网络请求API用来代替XMLHttpRequest返回 Promise不是第三方库不用安装。❗注意fetch只有网络异常才会 rejectHTTP 404/500 不会抛异常这点和axios不一样。基础语法fetch(resource,options).then(response{}).catch(error{})resourceurl字符串options配置对象method、headers、body等返回PromiseResponse对象Response 对象常用属性response.ok// boolean状态码200‑299为true404/500也是okfalse不会进catchresponse.status// http状态码 200、404、500response.json()// 解析响应为JSON返回Promiseresponse.text()// 获取原始文本response.blob()// 文件二进制response.headers// 响应头1. GET 请求最简单asyncfunctiongetDemo(){try{constresawaitfetch(https://jsonplaceholder.typicode.com/todos/1)// fetch 404/500不会抛出错误需要手动判断okif(!res.ok)thrownewError(HTTP错误:${res.status})constdataawaitres.json()console.log(data)}catch(err){// 网络断网、跨域才会走到这里console.error(请求失败,err)}}getDemo()2. POST 请求发送JSONPOST发JSON必须手动设置headers:{Content‑Type:application/json}body要JSON.stringify()asyncfunctionpostDemo(){constpayload{title:hello,body:world,userId:1}try{constresawaitfetch(https://jsonplaceholder.typicode.com/posts,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(payload)})if(!res.ok)thrownewError(res.status)constdataawaitres.json()console.log(返回结果,data)}catch(e){console.error(e)}}postDemo()3. 提交表单 FormData上传文件/表单不要手动设置Content‑Type浏览器会自动带上boundaryasyncfunctionformDataDemo(){constformDatanewFormData()formData.append(username,zhangsan)// formData.append(file, fileObj) // 上传文件constresawaitfetch(/api/upload,{method:POST,body:formData})constdataawaitres.json()}4. 常用配置项完整示例fetch(url,{method:GET,// GET POST PUT DELETE PATCHheaders:{Content-Type:application/json,token:xxxxxx// 请求头携带token},body:JSON.stringify({a:1}),// GET不要写bodymode:cors,// cors、no‑cors、same‑origincredentials:include,// 携带cookieinclude跨域也带same‑origin仅同源signal:abortSignal,// 取消请求}) 取消 fetch 请求AbortController非常常用React组件卸载要取消请求防止setState在卸载组件执行报错asyncfunctionabortDemo(){constcontrollernewAbortController()constsignalcontroller.signal// 500ms后取消请求setTimeout(()controller.abort(),500)try{constresawaitfetch(https://jsonplaceholder.typicode.com/todos/1,{signal})constdataawaitres.json()console.log(data)}catch(err){if(err.nameAbortError){console.log(请求被手动取消)}}}abortDemo()React中使用组件卸载取消请求useEffect((){ const controller new AbortController() const signal controller.signal async function loadData(){ const res await fetch(/api/list, {signal}) } loadData() // effect清理函数组件卸载执行abort return () controller.abort() }, [])fetch vs axios 重点区别面试特性fetchaxios依赖浏览器原生无需安装第三方库错误处理404/500不会reject要判断ok非2xx直接进入catch拦截器无需要自己封装内置请求/响应拦截器超时无timeout靠AbortController模拟直接timeout配置转换数据手动 res.json()自动解析JSON取消请求AbortControllercancelToken / AbortController✨ 简易封装fetch项目里可以直接用asyncfunctionrequest(url,options{}){constbaseUrlconstheaders{Content-Type:application/json,...options.headers}// token示例 headers.Authorization Bearer ${localStorage.getItem(token)}constresawaitfetch(baseUrlurl,{...options,headers})if(!res.ok){thrownewError(http:${res.status})}returnres.json()}// 使用// request(/api/todo,{method:GET})// .then(dconsole.log(d))⚠️ 坑总结HTTP 4xx、5xx 不会触发catch必须手动判断!res.okPOST JSON必须JSON.stringify设置Content‑Type:application/jsonFormData不要手动设置Content‑Type组件卸载记得AbortController.abort()取消请求避免内存泄漏fetch不支持Node.js低版本Node18才内置fetch旧node需要安装node‑fetch包。实战范例重点留意范例代码中的多层错误处理useEffect((){// 使用原生 fetch 获取数据fetch(http://localhost:5293/api/products?keywordMacBook).then((response){if(!response.ok){// 如果响应状态码不是 2xx 范围的成功响应抛出错误throw newError(Failed to fetch data);}returnresponse.json();// 如果成功解析 JSON}).then((data){if(data.code!200)throw newError(data.message);returndata;});},[]);

相关新闻

程序员如何平衡技术理性与生活感性:从摇滚乐到市井烟火

程序员如何平衡技术理性与生活感性:从摇滚乐到市井烟火

1. 从代码到生活:一个程序员的“跨界”叙事“跨界”这个词,在技术圈里快被用滥了。从程序员转产品经理,从后端转算法,甚至从互联网转行卖保险,似乎都算“跨界”。但今天我想聊的,可能和你理解的都不太一样。…

2026/10/6 18:26:24 阅读更多 →
定制化企业网盘深度解析:技术能力、落地场景与产品选型指南

定制化企业网盘深度解析:技术能力、落地场景与产品选型指南

一、前言在企业数字化转型持续深化的当下,文件数据已经成为企业核心数字资产,贯穿办公协作、业务流转、数据归档、合规留存全流程。企业网盘作为企业文件存储、团队协同、数据管控的核心基础设施,是企业数字化体系中不可或缺的重要模块。市面…

2026/10/10 6:06:16 阅读更多 →
网络安全日报实战指南:从信息聚合到情报驱动的安全运营

网络安全日报实战指南:从信息聚合到情报驱动的安全运营

1. 项目概述:一份“熟透”的网络安全日报意味着什么?“枇杷熟了”,这个标题乍一看充满了生活气息,甚至有些诗意,但当它与“全球网络安全日报2026-03-10”结合在一起时,就形成了一种独特的张力。这不像是一份…

2026/10/8 8:12:11 阅读更多 →

最新新闻

智谱公布补偿方案:“偷代码“风波是按下暂停键,还是只开了个头?

智谱公布补偿方案:“偷代码“风波是按下暂停键,还是只开了个头?

智谱公布补偿方案:"偷代码"风波是按下暂停键,还是只开了个头? 【免费下载链接】ZCode ZCode 是 AI 编程工作台,提供桌面应用、浏览器界面和终端 Agent。本仓库包含客户端、后端服务、共享 UI,以及 Agent CLI…

2026/10/10 21:22:08 阅读更多 →
Java构建生态监测大屏:从数据治理到ECharts可视化的完整实践

Java构建生态监测大屏:从数据治理到ECharts可视化的完整实践

做了这么多年Java后端,也经手过不少数据可视化项目,我发现一个很有意思的现象:一提到可视化,大家的第一反应往往是Python,或者是前端那一套高交互的方案。但真正落到城市生态环境监测这种场景,纯Java技术栈…

2026/10/10 21:22:08 阅读更多 →
三电平并网逆变器不平衡电网Simulink仿真建模与负序抑制

三电平并网逆变器不平衡电网Simulink仿真建模与负序抑制

1. 项目背景与研究价值做并网逆变器仿真的,多半都被三相电网不平衡折磨过。电网电压一出现塌陷,直流侧二次纹波、并网电流畸变、功率振荡一个接一个冒出来。这时候如果再叠加三电平逆变器的中点电位漂移问题,传统的两电平单dq控制基本是撑不住…

2026/10/10 21:22:08 阅读更多 →
JUnit 5 类模板测试:用 @ClassTemplate 让多个实现类共用一套契约用例

JUnit 5 类模板测试:用 @ClassTemplate 让多个实现类共用一套契约用例

1. 别找错了:JUnit 5 其实没有内置的 ClassTemplate先说个容易踩的坑。很多同学在项目里搜“ClassTemplate”,搜了半天找不到,因为 JUnit 5 官方注解列表里压根没有这个东西。官方提供的是TestTemplate,用来把“一个测试方法”变成…

2026/10/10 21:22:08 阅读更多 →
TFT-LCD阵列激光修复工艺全解析:从缺陷识别到量产闭环

TFT-LCD阵列激光修复工艺全解析:从缺陷识别到量产闭环

一块G8.5规格的液晶玻璃基板在阵列工序最后一道检测时被AOI设备画了个红圈——第214行第7列的数据线与像素电极之间出现一颗导电异物,并联通了本不该相连的两条线。这块基板上一共有60片电视面板,如果按整块报废处理,损失的是六位数的良率成本…

2026/10/10 21:22:08 阅读更多 →
旅游景点数据分析实战:从评论表到客流预测的完整复现路径

旅游景点数据分析实战:从评论表到客流预测的完整复现路径

简介:这份资源面向具备一定Python基础、希望入门数据分析实战的开发者与旅游行业从业者,围绕去哪儿网国庆期间景点数据展开完整分析流程。包内共7个文件,以5个html可视化页面、1个xlsx数据源和1个py分析脚本为主,压缩包约79KB&…

2026/10/10 21:21:08 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →