fetch() 是现代标准但需手动补全 Cookie、错误处理和超时;常见无响应因忘 await/.then(),且 4xx/5xx 不 reject;需检查 res.ok、JSON.stringify、FormData 用法、GET 无 body、credentials 控制跨域 Cookie、AbortController 实现超时与取消。
JavaScript 发送网络请求,
是现代标准方案,但默认不带 Cookie、不自动处理 4xx/5xx 状态、不支持超时——这些不是“bug”,而是设计选择,得手动补全。
为什么
调用后页面没反应?
常见原因是忘记
或漏掉
,且
只在**网络失败**(如断网、DNS 错误)时 reject,HTTP 状态码 404、500 仍算 fulfilled。
检查是否写了
或
手动判断
(即
别直接
,那只是打印一个
对象
怎么发 POST 并传 JSON?
必须显式设置
请求头,且
需是字符串(不能直接传对象)。
不可省略,否则后端收不到合法 JSON
若后端用
,改用
实例作
,此时不要设
(
浏览器
会自动生成带 boundary 的 header)
GET 请求不能有
,参数只能拼在 URL 后
如何让
带 Cookie 或支持跨域认证?
默认情况下,
跨域请求不发 Cookie,也不暴露响应头(如
),需靠
选项控制。
Comet AI 浏览器
下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
下载
立即学习
“
Java免费学习笔记(深入)
”;
同域请求:无需额外配置,Cookie 自动携带
跨域请求要发 Cookie:加
,且后端必须返回
注意:
时,
不能为
,必须指定具体域名
怎么给
加超时或取消请求?
本身不支持超时,也无原生取消机制,得靠
+
模拟。
会触发
Promise reject,错误类型是
,
多个并发请求共用一个
可一键取消全部
超时时间不能靠
精确控制(网络阻塞时可能延迟),仅作粗略防护
真正难的不是调通一次请求,而是统一处理错误路径、鉴权刷新、缓存策略和 loading 状态——
只是基础工具,封装层才决定项目里请求代码是否可维护。
fetch()fetch()await.then()fetch()await fetch(...)fetch(...).then(res => {...})res.okres.status >= 200 && res.status )console.log(fetch(...))Promisefetch()Content-Typebodyfetch('/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username: 'admin', password: '123' })
})
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
});
JSON.stringify()form-dataFormDatabodyContent-Typebodyfetch()fetch()Set-Cookiecredentialscredentials: 'include'Access-Control-Allow-Credentials: truecredentials: 'include'Access-Control-Allow-Origin*fetch()fetch()AbortControllertimeoutconst controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
fetch('/api/data', {
signal: controller.signal
})
.finally(() => clearTimeout(timeoutId));
controller.abort()fetch()DOMExceptionname === 'AbortError'AbortControllersetTimeoutfetch()