http成功不等于业务成功,需先用fetchwithstatuscheck拦截非2xx状态码,再手动校验响应体code字段,将业务错误转为带code和raw属性的error对象统一处理。

直接用 try/catch 捕获网络层错误(如断网、超时)没问题,但 API 返回的“业务错误”——比如 HTTP 状态码 200 却带 { code: 4001, msg: "用户名已存在" }——不会触发 catch,必须手动判断。
关键在于:HTTP 成功不等于业务成功。你需要在 await response.json() 后,主动检查响应体里的错误字段。
✅ 先统一处理 HTTP 层状态
很多接口返回 200 即使是失败(如后端统一包装),但也有部分接口会用真实状态码(4xx/5xx)。建议先做基础拦截:
async function fetchWithStatusCheck(url, options = {}) {
const res = await fetch(url, options);
// 如果 HTTP 状态异常(非 2xx),直接抛错,进 catch
if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
}
return res;
}
这样能自动捕获 404、500 等真实网络/服务端错误。
✅ 再校验业务响应体结构
假设后端约定所有响应都是 { code: number, data: any, msg: string },且 code !== 0 表示业务失败:
async function apiCall(url) {
try {
const res = await fetchWithStatusCheck(url);
const body = await res.json();
// ? 关键:这里不是 throw,而是构造可识别的错误对象
if (body.code !== 0) {
// 把业务错误也转成 Error 实例,便于统一处理
const err = new Error(body.msg || '请求失败');
err.code = body.code;
err.raw = body; // 保留原始数据,方便调试或特殊逻辑
throw err;
}
return body.data;
} catch (err) {
// 此处能捕获两类错误:HTTP 错误 + 业务 code 错误
console.warn('API 调用异常', err);
throw err; // 让调用方决定如何处理
}
}
调用时就能清晰区分错误类型:
try {
const user = await apiCall('/api/user');
} catch (err) {
if (err.code === 4001) {
showToast('用户名已被占用');
} else if (err.code === 401) {
redirectToLogin();
} else {
showToast(err.message || '操作失败,请重试');
}
}
✅ 进阶:封装成「业务安全」的请求函数(推荐)
把校验逻辑抽离,避免每个接口都写重复判断:
// 通用业务响应校验器
function validateBizResponse(data, { successCode = 0 } = {}) {
if (data?.code == null) {
throw new Error('响应格式错误:缺少 code 字段');
}
if (data.code !== successCode) {
const err = new Error(data.msg || `业务错误[code=${data.code}]`);
err.code = data.code;
err.data = data;
throw err;
}
return data.data;
}
// 使用示例
async function getUser(id) {
const res = await fetch(`/api/user/${id}`);
const json = await res.json();
return validateBizResponse(json); // 自动校验并提取 data
}
这样既保持调用简洁,又确保所有 API 响应都被一致校验。
⚠️ 注意几个易忽略点
- 不要只依赖
response.ok:很多后端强制返回 200,错误信息全在 body 里 -
throw后记得return或明确流程终止,避免后续代码意外执行 - 错误对象尽量附带
code、raw、timestamp等上下文,方便监控和排查 - 如果部分接口返回格式不统一(如有的用
status,有的用errno),可在validateBizResponse中加适配参数或预处理器
不复杂但容易忽略。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











