javascript fetch api 本身不支持在发送前对请求体进行预压缩,因为 fetch 的 body 参数仅接受字符串、blob、buffersource 或 formdata 等原始数据格式。要实现请求数据的预压缩,必须手动使用 compressionstream api 将数据流转换为 gzip 或 deflate 格式,并设置正确的 content-encoding 和 content-type 头部。

如何手动构建压缩后的请求体
通过 CompressionStream('gzip') 创建可读流,并将输入数据管道化传输给 fetch 的 body 参数。这种方式避免了将整个压缩文件加载到内存中,适合处理大体积数据。需要确保服务端支持 Content-Encoding: gzip,否则服务器会将其视为二进制乱码。

const data = JSON.stringify({ key: "value", timestamp: Date.now() });
async function sendCompressedData(url) {
const stream = new CompressionStream('gzip');
const writer = stream.writable.getWriter();
// 将文本转为 Uint8Array 并写入压缩流
const encoder = new TextEncoder();
await writer.write(encoder.encode(data));
await writer.close();
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Encoding': 'gzip' // 关键:告知服务端已压缩
},
body: stream.readable
});
return response.json();
}
如何处理响应中的压缩数据
当服务端返回压缩数据时,Fetch API 会自动解压缩 gzip 或 deflate 格式的响应体,前提是服务端正确设置了 Content-Encoding 头。开发者无需额外操作即可通过 response.json() 获取原始数据。若需手动处理非标准压缩格式,可使用 DecompressionStream。

async function getCompressedData(url) {
const response = await fetch(url, {
headers: {
'Accept-Encoding': 'gzip, deflate'
}
});
// 自动处理 Content-Encoding: gzip
const data = await response.json();
console.log(data); // 原始未压缩对象
}
getCompressedData('https://api.example.com/data');
CompressionStream 在不同浏览器环境下的兼容性表现
CompressionStream 是 Web Streams API 的一部分,目前仅在基于 Chromium 的浏览器(如 Chrome 86+)和 Firefox 94+ 中完全支持。在 Safari 中,该 API 尚未实现,直接使用会导致运行时错误。对于不支持的环境,需回退至第三方库如 pako 进行同步压缩,但这会阻塞主线程。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











