javascript如何与后端API交互_如何处理HTTP请求和响应【教程】
技术百科
幻影之瞳
发布时间:2026-01-28
浏览: 次 fetch 是 JavaScript 与后端 API 交互的核心,返回 Promise 需用 .then() 或 async/await 处理;它不因 HTTP 错误状态码(如 404、500)自动 reject,须手动检查 response.ok。
JavaScript 与后端 API 交互的核心是 fetch,不是 XMLHttpRequest,也不是第三方库(除非你有明确兼容性或功能需求)。
用 fetch 发送 GET 请求并读取 JSON 响应
现代浏览器中,fetch 是最轻量、最标准的选择。它返回 Promise,必须用 .then() 或 async/await 处理;且 fetch 不会在 HTTP 状态码异常(如 404、500)时自动 reject,这点极易踩坑。
常见错误现象:Uncaught (in promise) TypeError: Failed to fetch(网络失败)、或静默拿到 500 响应却没报错。
- 始终检查
response.ok(即status >= 200 && status ),再调用response.json() -
response.json()本身可能 reject(比如返回了非 JSON 内容),需单独 try/catch - 不要省略
catch—— 网络中断、CORS 拒绝、DNS 失败都会触发
async function getUser(id) {
try {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('获取用户失败:', err.message);
throw err;
}
}
发送 POST 请求并提交 JSON 数据
POST 不只是“发数据”,关键在于设置正确的请求头和序列化体。后端通常期望 Content-Type: application/json,而 fetch 默认不设任何 header,也不会自动 JSON.stringify。
立即学习“Java免费学习笔记(深入)”;
- 必须手动设置
headers: { 'Content-Type': 'application/json' } -
body必须是字符串,传对象会报错:TypeError: Request with GET/HEAD method cannot have body(其实是 body 类型不对) - 如果后端要求表单格式(
application/x-www-form-urlencoded),要用new URLSearchParams(data)而不是JSON.stringify
async function createUser(userData) {
const res = await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(userData)
});
if (!res.ok) throw new Error(`创建失败: ${res.status}`);
return res.json();
}
处理 token 认证和跨域请求(CORS)
带认证的请求常失败,不是因为代码写错,而是服务端未正确配置 CORS 响应头,或前端漏传凭证。
- 若 API 需要 Bearer token,必须加
Authorizationheader:headers: { Authorization: 'Bearer ' + token } - 若请求携带 cookie 或认证头(如
Authorization),fetch必须显式设credentials: 'include',否则浏览器不会发送 - CORS 错误(
如
Response to preflight request doesn't pass access control check)是服务端问题,前端无法绕过;但可确认是否误发了非简单请求(如自定义 header、非 GET/POST 方法)触发了预检
何时该用 axios 而不是原生 fetch
不是“更好”,而是“更省事”——当你反复处理重复逻辑时:axios 自动序列化 JSON、自动抛出 HTTP 错误、支持请求/响应拦截器、取消请求(AbortController 在 fetch 中需要手动传)、统一错误结构。
- 如果你项目已用 Vue 3 + Composition API,
useAxios(@vueuse/core)能简化很多样板 - 但若只发几个简单请求,引入
axios反而增加包体积(约 5 kB gzipped),得不偿失 -
fetch的AbortController支持是完整的,但写法比axios.cancelToken(已废弃)或CancelToken.source()更啰嗦
真正容易被忽略的点:HTTP 缓存行为。GET 请求默认可被浏览器缓存,导致重复调用返回旧数据;必要时加时间戳参数或设置 cache: 'no-store',别等线上出 bug 才想起来查 Network 面板里的 “from disk cache”。
# 浏览器
# app
# js
# json
# javascript
# java
# access
# 前端
# cookie
# include
# axios
# vue
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11如何设置开机自动联网 Win11宽带连接
- XAMPP 启动失败(Apache 突然停止)的终
- 如何在Golang中使用encoding/gob序
- php订单日志怎么记录物流_php记录订单物流变更
- Win10如何卸载预装Edge扩展_Win10卸载
- Win11怎么解压RAR文件 Win11自带解压功
- 如何在Golang中实现文件下载_Golang文件
- TestNG的testng.xml配置文件怎么写
- Python脚本参数接收_sys与argparse
- php485函数怎么捕获异常_php485错误处理
- Windows系统文件被保护机制阻止怎么办_权限不
- Win11怎么设置默认终端应用_Windows11
- PythonDocker高级项目部署教程_多容器管
- Win11关机快捷键是什么_Win11快速关机方法
- Win11怎么设置ip地址_Windows 11手
- 如何使用Golang开发基础文件下载功能_Gola
- PowerShell怎么创建复杂的XML结构
- PHP主流架构如何做单元测试_工具与流程【详解】
- Win10怎么更改用户名 Win10修改账户名称操
- Win11怎么更改鼠标指针方案_Windows11
- php怎么捕获异常_trycatch结构处理运行时
- windows如何测试网速_windows系统网络
- c++中如何求一个数的平方根_c++ sqrt函数
- 如何在包含多值的列中精准搜索指定演员?
- Win11怎么关闭透明效果_Windows11辅助
- Python面向对象实战讲解_类与设计模式深入理解
- Windows10电脑怎么设置自动连接WiFi_W
- Win11资源管理器卡顿怎么办 Win11文件资源
- C++友元类使用场景_C++类间协作设计方式讲解
- 如何将竖排文本文件转换为横排字符串
- Win11怎么设置任务栏图标大小_Windows1
- Python多线程使用规范_线程安全解析【教程】
- php485读数据时阻塞怎么办_php485非阻塞
- Win11怎么关闭任务栏小组件_Windows11
- Python深度学习实战教程_神经网络模型构建与训
- Mac如何备份到iCloud_Mac桌面与文稿文件
- PHP主流架构怎么部署到Docker_容器化流程【
- Windows怎样关闭桌面弹窗广告_Windows
- Python生成器表达式内存优化_惰性计算说明【指
- php485返回空数组怎么回事_php485数据接
- 如何高效识别并拦截拼接式恶意域名 spam
- c++获取当前时间戳_c++ time函数使用详解
- 如何用::实现单例模式_php静态方法与作用域操作
- mac怎么打开终端_MAC终端Terminal使用
- XSLT怎么生成动态的HTML属性名和标签名
- 如何在Golang中编写异步函数测试_Golang
- 如何在Golang中使用内置函数_Golangle
- php做exe支持多线程吗_并发处理实现方式【详解
- 如何使用Golang recover捕获panic
- c++怎么实现高并发下的无锁队列_c++ std:


QQ客服