高阶函数封装统一API请求器,分三层校验:HTTP状态、业务字段、自定义错误处理;支持前端safeRequest、后端tryCatch中间件、Python RequestsUtil类,保持错误语义不丢失。

用高阶函数写统一 API 请求包装器,核心是把「发请求 + 检查响应 + 处理错误」这三步收进一个函数里,让业务代码只写“要什么”,不操心“出错了怎么办”。它不是简单套个 try/catch,而是分层拦截、可配置、不侵入原始逻辑。
封装原则:分层校验,保留错误语义
一次真实请求失败可能发生在不同环节:网络断开、HTTP 状态异常(如 401/500)、后端返回业务错误(data.code !== 0)。好的包装器要逐层识别,并保持原始错误类型(比如 TypeError 和自定义 ApiError 不应被抹平):
- 第一层:检查 fetch 返回的 Response.ok 和 status
- 第二层:解析 JSON 后检查业务字段(如 code、success),按项目规范抛错
- 第三层:允许调用方传入 onError 回调,做日志、提示或静默重试等差异化处理
基础实现:safeRequest 高阶函数
它接收一个「返回 Promise 的函数」(不是已执行的 Promise),确保整个链路可控:
const safeRequest = async (promiseFn, options = {}) => {
try {
const res = await promiseFn();
if (!res.ok) throw new Error(`HTTP ${res.status}`);
<pre class="brush:php;toolbar:false;">const data = await res.json();
if (data.code !== 0) {
throw new Error(data.message || `API error: ${data.code}`);
}
return data;} catch (err) { console.error('[API ERROR]', err); if (options.onError) options.onError(err); throw err; // 不吞错误,便于 .catch() 或顶层兜底 } };
使用时直接传请求动作,不用再写 try/catch:
safeRequest(
() => fetch('/api/user', { method: 'GET' }),
{ onError: (err) => notifyUser(err.message) }
)
.then(data => renderUser(data))
.catch(() => fallbackToCache());
适配 Express 路由:tryCatch 中间件包装器
在 Node.js 后端,异步路由处理器若未被正确 await,Promise rejection 会变成未捕获异常。包装器必须 await handler(req, res, next),并把所有异常统一交给 next(err):
export const tryCatch = (handler) => {
return async (req, res, next) => {
try {
await handler(req, res, next); // ✅ 关键:await 才能捕获异步 reject
} catch (err) {
next(err); // 交由全局错误中间件处理
}
};
};
控制器中直接写业务逻辑,不调 next(err):
export const login = tryCatch(async (req, res) => {
const user = await User.findOne({ email: req.body.email });
if (!user) throw new Error('User not found');
res.json({ token: signToken(user) });
});
Python 场景:RequestsUtil 类 + 方法封装
在 Python 接口测试中,常用类封装 session 和通用请求方法,并内置状态码断言:
def send_request(self, method, url, **kwargs):
try:
response = self.session.request(method, url, **kwargs)
response.raise_for_status() # 自动检查 4xx/5xx
return response
except requests.RequestException as e:
print(f"Request failed: {e}")
return None大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











