Angular 4中如何触发已缓存的HTTP请求?
嘿,我来帮你搞定这个问题!你已经通过拦截器克隆并存储了HTTP请求,现在要触发它其实不难,但有几个关键细节要注意,我一步步给你拆解:
触发缓存的克隆HTTP请求的核心思路与步骤
1. 先确认你的缓存请求是「可重复使用」的
首先要记住:HTTP请求的body是一个可读流,默认情况下只能被消费一次。所以你当初克隆请求的时候,必须确保存储的请求对象(或请求信息)能被重复发起——如果是带body的POST/PUT等请求,不能直接缓存原始的流对象,得先把body转成可复用的格式(比如Blob、JSON字符串)。
举个Fetch拦截器的存储示例(确保缓存的请求可复用):
// 用来存储缓存请求的数组 const cachedRequests = []; // 封装带缓存逻辑的Fetch方法 async function cachedFetch(url, options) { const originalRequest = new Request(url, options); // 克隆请求对象 const requestClone = originalRequest.clone(); // 处理带body的请求:把body转为Blob(可重复读取) let cachedBody; if (originalRequest.method !== 'GET' && originalRequest.body) { cachedBody = await requestClone.blob(); } // 存储完整的请求信息(不是直接存Request对象,避免流失效) cachedRequests.push({ url: originalRequest.url, method: originalRequest.method, headers: new Headers(originalRequest.headers), // 克隆Headers对象 body: cachedBody }); // 发起原请求 return fetch(originalRequest); }
2. 触发缓存请求:重新构建并发起
当你需要触发缓存的请求时,从缓存中取出对应的请求信息,重新构建一个合法的请求对象(或HTTP客户端的配置),再用你的HTTP客户端(Fetch/Axios等)发起即可。
示例1:用Fetch触发缓存请求
// 假设我们要触发第一个缓存的请求 const targetReq = cachedRequests[0]; // 重新构建Request对象 const newRequest = new Request(targetReq.url, { method: targetReq.method, headers: targetReq.headers, body: targetReq.body // 这里的body是之前保存的Blob,可重复使用 }); // 发起请求 fetch(newRequest) .then(res => res.json()) .then(data => console.log('缓存请求触发成功:', data)) .catch(err => console.error('请求失败:', err));
示例2:用Axios触发缓存请求
Axios的请求配置是普通JS对象,不存在流的问题,缓存和触发会更简单:
const axios = require('axios'); const cachedAxiosRequests = []; // Axios请求拦截器:缓存请求配置 axios.interceptors.request.use(config => { // 深克隆配置对象(避免原配置被修改影响缓存) const clonedConfig = { ...config, data: config.data ? JSON.parse(JSON.stringify(config.data)) : undefined }; cachedAxiosRequests.push(clonedConfig); return config; }); // 触发缓存的Axios请求 const targetAxiosReq = cachedAxiosRequests[0]; axios(targetAxiosReq) .then(res => console.log('Axios缓存请求触发成功:', res.data)) .catch(err => console.error('请求失败:', err));
3. 必看的注意事项
- 动态请求头更新:如果请求头里有动态内容(比如Authorization Token),触发前一定要检查并更新这些字段,避免因为token过期导致请求失败。
- 缓存标识管理:建议给每个缓存请求加唯一标识(比如请求ID、
URL+Method的组合),这样能精准触发你想要的那个请求,而不是盲目取数组中的某一项。 - GET请求简化:GET请求没有body,缓存时可以直接存储请求的URL和配置,触发时直接调用
fetch(url, options)即可,无需额外处理body。
内容的提问来源于stack exchange,提问作者Lalit Kushwah
相关产品推荐
相关产品推荐

