如何在JavaScript中使用fetch API实现请求的全局拦截与处理?请结合axios拦截器概念给出示例代码。
时间: 2024-11-28 15:29:53 浏览: 91
在JavaScript中,fetch API本身并不提供内置的拦截器功能,但我们可以通过封装和一些技术手段来实现类似axios的请求拦截器功能。这涉及到对fetch调用的封装以及在请求发起前后插入自定义逻辑。下面的示例代码展示了如何创建一个fetch请求的全局拦截器,并在请求发送前统一添加认证头,以及在请求返回后统一处理状态码:
参考资源链接:[JavaScript fetch请求拦截详解与示例](https://wenku.csdn.net/doc/6459ff41fcc5391368262693?spm=1055.2569.3001.10343)
首先,定义一个拦截器函数,该函数将封装原始的fetch方法,并添加拦截逻辑:
```javascript
// 定义一个全局拦截器函数
function setupFetchInterceptor() {
// 保存原始的fetch方法
const originalFetch = window.fetch;
// 重写fetch方法,实现拦截功能
window.fetch = function (url, options = {}) {
// 在请求发送前的拦截逻辑
if (options.headers && !options.headers.Authorization) {
// 假设accessToken是当前用户的访问令牌
options.headers.Authorization = `Bearer ${accessToken}`;
}
// 调用原始的fetch方法,并添加响应处理逻辑
return originalFetch(url, options).then(response => {
if (response.ok) {
return response.json().then(data => {
// 在这里处理成功的响应数据
return data;
});
} else {
// 在这里处理错误响应
return Promise.reject(new Error('Network response was not ok.'));
}
}).catch(error => {
// 在这里处理网络错误
console.error('Fetch error:', error);
return Promise.reject(error);
});
};
}
// 在程序初始化时调用设置拦截器的函数
setupFetchInterceptor();
// 示例:使用全局拦截器发出请求
fetch('***')
.then(response => {
// 继续处理响应数据
console.log(response);
})
.catch(error => {
// 处理请求错误
console.error(error);
});
```
在这个示例中,我们首先定义了一个`setupFetchInterceptor`函数,该函数首先保存了原始的fetch方法,然后重写了window.fetch,添加了请求和响应的处理逻辑。在请求发送前,我们检查了请求头是否设置了Authorization,如果未设置,则添加了相应的认证信息。在响应返回后,我们检查了响应状态,并根据状态码来处理成功或错误的情况。
需要注意的是,由于fetch API不支持请求拦截器,我们通过修改全局的fetch方法来实现这一功能。这种方法虽然有效,但可能会影响到全局的fetch行为,因此在使用时需要谨慎,避免与项目中的其他库或框架冲突。
为了更好地理解fetch请求拦截器的实现原理,建议参考提供的辅助资料《JavaScript fetch请求拦截详解与示例》。这份资料详细介绍了如何在不支持拦截器的fetch API中实现请求和响应的统一处理,提供了全面的示例和深入的讲解。在掌握基础知识后,你可以进一步探索如何与axios等库的拦截器特性进行比较,以及如何将fetch拦截技术应用到实际的项目中,以提升开发效率和项目的维护性。
参考资源链接:[JavaScript fetch请求拦截详解与示例](https://wenku.csdn.net/doc/6459ff41fcc5391368262693?spm=1055.2569.3001.10343)
阅读全文
相关推荐



















