fetch 本身不支持拦截器,但可通过封装 request 函数模拟:用 async/await 包裹 fetch,统一处理响应解析、status 判断、业务 code 校验、错误分类、自动重试及 abortcontroller 取消请求。

Fetch 本身不支持拦截器,但可以通过封装函数或结合 Promise 链、async/await 来模拟拦截器行为,统一处理响应状态、错误、鉴权失败、数据解包等逻辑。
封装 fetch 函数实现响应拦截
最常用且轻量的方式是写一个自定义的 request 函数,在里面统一处理响应解析、错误判断和业务状态码:
- 用 async/await 包裹原生 fetch,等待响应后调用
response.json() - 检查
response.ok(即 HTTP 状态码在 200–299);不满足时抛出错误,便于后续catch或try/catch - 解析出的 JSON 数据再按业务约定检查
code字段(如0表示成功),非 0 则 throw 自定义错误对象,携带message和data - 所有请求都走这个函数,就实现了“响应拦截”效果
统一错误处理与自动重试(可选增强)
在封装函数中还可加入基础容错能力:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 对网络错误、超时、4xx/5xx 响应做分类提示(例如弹 Toast 或写入日志)
- 对特定错误码(如登录过期 401)触发登出流程,跳转登录页
- 对临时性错误(如 502、网络中断)可加简单重试逻辑(最多 2 次,带退避)
配合 AbortController 实现请求取消(类 axios.CancelToken)
虽然不是拦截器核心,但在实际项目中常需取消请求。可在封装函数里支持传入 signal:
- 创建
AbortController实例,把signal传给 fetch 的options - 外部组件卸载或切换时调用
controller.abort(),避免 setState on unmounted - fetch 抛出
AbortError,可在拦截逻辑里静默忽略,不触发错误提示
进阶:用代理或 Request/Response 构造器做更底层控制?
注意:不能用 Proxy 拦截全局 fetch,因为 fetch 是原生函数,无法被 Proxy 有效代理;也不能修改 Request/Response 原型,它们是只读的。所以真正的“拦截器”只能靠封装 + 规范调用习惯来达成。如果团队规模大、需求复杂,可考虑引入类似 axios 的库,它原生支持拦截器,再通过 axios.interceptors.response.use 统一处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










