fetch api 无原生拦截器,但可通过重写 window.fetch 实现请求前注入鉴权信息:保存原始函数,读取 token 后添加 authorization 头,并兼容各类调用方式;进阶可封装 gettoken() 和响应处理 401。

手动重写 fetch 实现请求拦截
核心思路是保存原始 fetch 函数,再用自定义逻辑包裹它,在发起请求前自动添加 Authorization 头:
- 先从 localStorage、内存变量或 token 管理器中读取有效 token
- 检查 token 是否存在且非空,避免拼出
Bearer undefined - 若 headers 未定义,初始化为空对象;再合并 Authorization 和其他默认头(如 Content-Type)
- 保持原有参数结构不变,确保所有合法调用方式(字符串 URL、Request 实例、带 init 的对象)都兼容
基础拦截示例(含安全校验)
以下代码可直接运行,支持 GET/POST 及 Request 对象入参:
const originalFetch = window.fetch;
window.fetch = function(input, init = {}) {
const token = localStorage.getItem('auth_token');
// 只在有 token 时注入,避免污染无鉴权请求
if (token) {
const headers = new Headers(init.headers || {});
headers.set('Authorization', `Bearer ${token}`);
init = {
...init,
headers
};
}
return originalFetch(input, init);
};
进阶:支持动态 token 更新与错误响应处理
真实项目中 token 可能过期或刷新,建议把 token 获取逻辑抽离为函数,并在响应拦截中统一处理 401:
- 封装 getToken(),支持从内存缓存、localStorage 或异步刷新接口获取
- 对 Response 进行二次包装,比如自动解析 JSON 并检查业务 code 字段
- 捕获 401 响应时触发登出流程(清 token + 跳转登录页),无需每个请求单独写 catch
- 注意:fetch 返回的是 Promise
,响应拦截需在 then/catch 链中做,不能在 fetch 重写里直接 await response
为什么不推荐用第三方库(如 fetch-intercept)?
多数场景下没必要引入额外依赖:
- fetch-intercept 在现代打包工具中可能影响 tree-shaking
- 其底层仍是 monkey patch,和手写重写无本质区别,但增加了调试链路
- 简单需求一行
headers.set('Authorization', ...)就够,过度封装反而掩盖关键逻辑
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











