在JavaScript中使用Fetch API修改响应体并生成新响应的核心策略是通过“读取-修改-新建”三步实现。由于Response对象不可变且响应体为一次性流,直接修改无效,需按以下步骤操作:
1. 发起Fetch请求并获取原始响应使用fetch()发起请求,获取原始Response对象。此时不可直接修改响应体。
const originalResponse = await fetch('https://api.example.com/data'
);2. 提取原始响应体内容根据响应类型选择对应方法提取内容,注意此操作会消耗响应体,原始Response对象后续无法再读取。
- 文本内容:response.text()const originalText = await originalResponse.text();
- JSON数据:response.json()const originalJson = await originalResponse.json();
- 二进制数据:response.blob()或response.arrayBuffer()const originalBlob = await originalResponse.blob();
3. 修改响应体内容根据业务需求处理提取的数据:
- 文本替换:直接操作字符串。const modifiedText = originalText.replace('placeholder', 'new-value');
- JSON数据修改:解析后修改对象,再转字符串。originalJson.key = 'new-value';const modifiedJson = JSON.stringify(originalJson);
- 二进制处理:需通过Blob或ArrayBuffer操作(如图片处理需额外库)。
4. 构建新Response对象使用修改后的内容作为主体,复制原始响应的状态码、状态文本和头部信息,创建新Response对象。
const newResponse = new Response(modifiedText, { status: originalResponse.status, statusText: originalResponse.statusText, headers: Object.fromEntries(originalResponse.headers.entries()) // 转换为普通对象});- 关键点:
headers需传入Headers对象或键值对对象,直接传递原始Headers对象可能导致问题,故用Object.fromEntries()转换。
若需保留原始Headers对象,可先克隆:const headersObj = Object.fromEntries(originalResponse.headers.entries());const newHeaders = new Headers(headersObj);
完整示例:修改JSON响应体(async () => { const originalResponse = await fetch('https://jsonplaceholder.typicode.com/posts'
); // 1. 提取JSON内容 const originalJson = await originalResponse.json(); // 2. 修改数据(例如:添加新字段) const modifiedData = originalJson.map(post => ({ ...post, modified: true })); // 3. 构建新Response const newResponse = new Response(JSON.stringify(modifiedData), { status: originalResponse.status, statusText: originalResponse.statusText, headers: Object.fromEntries(originalResponse.headers.entries()) }); // 验证新响应 const newData = await newResponse.json(); console.log(newData[0]); // 输出修改后的第一个帖子})();注意事项总结通过“读取-修改-新建”策略,可灵活操作Fetch响应体。核心步骤包括:
- 发起请求获取原始Response。
- 提取并修改响应体内容(注意消耗性)。
- 复制元数据(状态码、头部)创建新Response。
掌握此方法后,可轻松实现响应体定制化,适用于中间件、API代理等场景。