二次封装 fetch 的核心是用函数包裹原始 fetch,在请求前和响应后插入自定义逻辑,模拟 Axios 拦截器:请求拦截器改写 URL 和配置(如加 token、设 headers),响应拦截器统一解析 JSON、判状态码、处理业务错误,并支持链式注册、保留原生能力及统一错误类型。

直接用原生 fetch 缺少统一处理请求头、错误、登录态、loading 等逻辑的能力,二次封装的核心是用函数包裹原始 fetch,在发起前和响应后插入自定义逻辑,模拟 Axios 风格的拦截器行为。
请求拦截器:改写配置再发请求
在调用 fetch 前修改 input(URL)和 init(配置),比如自动添加 token、设置默认 headers、序列化 body。
- 检查本地是否有有效 token,有则注入到
headers.Authorization - 若
body是对象且未指定Content-Type,自动转为 JSON 并补上application/json - 统一加上
Accept: application/json和项目级请求标识(如X-Request-ID)
响应拦截器:统一解析与错误分类
响应拦截不是“拦截”网络响应,而是对 Response 对象做预处理:检查状态码、解析 JSON、抛出业务错误、处理登录过期等。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
response.ok判断 HTTP 是否成功(200–299),否则抛出自定义错误 - 调用
response.json()并 catch 解析失败(如返回非 JSON 的 HTML 错误页) - 检查响应体中的业务 code(如
{ code: 401, msg: "登录失效" }),匹配后跳转登录页或清空 token
支持链式调用与拦截器注册
封装一个类或工厂函数,暴露 useRequestInterceptor 和 useResponseInterceptor 方法,让拦截器可动态添加、顺序执行。
立即学习“Java免费学习笔记(深入)”;
- 内部维护两个数组:请求拦截器栈(按注册顺序正向执行)、响应拦截器栈(逆序执行,类似 Promise.then 链)
- 每个拦截器接收上下文对象(如
{ url, options, config }),可修改并返回新对象;响应拦截器接收{ response, data } - 最终 fetch 调用前合并所有请求拦截器结果,响应后逐个处理响应拦截器
保留原生能力,不破坏兼容性
封装层不隐藏 fetch 本身,仍支持 AbortSignal、cache、redirect 等原生选项,也不强制 JSON —— 允许用户显式设置 responseType: 'text' 或 'blob'。
- 通过配置项(如
parseJSON: false)跳过自动 JSON 解析 - 暴露底层
fetch实例,方便调试或特殊场景直连 - 错误统一继承
Error,附带response、status、url等字段,便于上层捕获处理

















