使用 Fetch API 读取 HTTP 响应体的多种方法

704 阅读3分钟

本文介绍使用前端使用Fetch时各种响应体数据读取方式

1. res.blob()

res.blob()方法用于获取响应体的二进制数据,并将其存储为Blob对象。Blob代表了一种不可变的、原始数据的类文件对象。它适用于处理如文件和图像等二进制数据。

适用场景:

  • 文件下载
  • 图像处理
  • 生成文件链接供用户下载

示例代码:

fetch(url).then(res => res.blob()).then(blob => {
  // 创建一个链接并模拟点击以下载文件
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'filename.ext';
  document.body.appendChild(a);
  a.click();
  a.remove();
  window.URL.revokeObjectURL(url);
});

2. res.arrayBuffer()

res.arrayBuffer()方法返回一个Promise,该Promise解析为响应体的ArrayBuffer对象。ArrayBuffer是一个代表了固定长度的原始二进制数据缓冲区,它不能直接操作,但可以转换为类型化数组。

适用场景:

  • 需要直接操作二进制数据
  • 转换为特定类型的数组(如Uint8Array

示例代码:

fetch(url).then(res => res.arrayBuffer()).then(buffer => {
  const uint8Array = new Uint8Array(buffer);
  // 进行二进制数据处理
});

3. res.text()

res.text()方法返回一个Promise,该Promise解析为响应体的文本内容。当响应体包含文本数据时,如HTML、CSS、JavaScript代码或纯文本。

适用场景:

  • 读取文本文件
  • 获取HTML内容
  • 处理纯文本数据

示例代码:

fetch(url).then(res => res.text()).then(text => {
  // 处理文本数据
  console.log(text);
});

4. res.json()

res.json()方法返回一个Promise,该Promise解析为响应体的JSON内容。当服务器返回JSON格式的数据时,这是最直接的方法来获取JavaScript对象。

适用场景:

  • 读取API返回的JSON数据
  • 处理复杂的响应结构

示例代码:

fetch(url).then(res => res.json()).then(json => {
  // 处理JSON对象
  console.log(json);
});

5. res.formData()

res.formData()方法返回一个Promise,该Promise解析为响应体的FormData对象。FormData接口提供了一种表示表单数据的键值对的方法。

适用场景:

  • 处理表单数据
  • 上传文件后读取响应数据

示例代码:

fetch(url).then(res => res.formData()).then(formData => {
  // 处理表单数据
  for (const pair of formData.entries()) {
    console.log(`${pair[0]}: ${pair[1]}`);
  }
});

6. res.body.getReader()

res.body.getReader()方法用于读取响应体的原始数据流。它返回一个ReadableStreamDefaultReader对象,该对象可以用于按块读取数据。

适用场景:

  • 读取大量数据,如大型文件
  • 流式处理数据,边读边处理

示例代码:

fetch(url).then(res => {
  // 创建一个读取器,用于读取响应体的数据流
  const reader = res.body.getReader();
  let bin = null;
  // 定义一个递归函数来处理读取到的数据块
  const read = ({ done, value }) => {
    // 如果读取完成,则返回累积的二进制数据
    if (done) return resolve(bin);
    if (bin !== null) {
      const newBin = new Uint8Array(bin.length + value.length);
      newBin.set(bin);
      newBin.set(value, bin.length);
      bin = newBin;
    } else bin = value;
    // 继续读取下一个数据块
    reader.read().then(read);
  };
  // 开始读取第一个数据块
  reader.read().then(read);
});

综合对比

以下表格对比了上述各种响应体数据读取方式的特点:

方法名返回类型适用场景备注
res.blob()Blob文件下载、图像处理、生成文件链接供用户下载代表不可变的、原始数据的类文件对象
res.arrayBuffer()ArrayBuffer需要直接操作二进制数据、转换为特定类型的数组表示固定长度的原始二进制数据缓冲区
res.text()String读取文本文件、获取HTML内容、处理纯文本数据返回响应体的文本内容
res.json()Object读取API返回的JSON数据、处理复杂的响应结构直接解析为JavaScript对象
res.formData()FormData处理表单数据、上传文件后读取响应数据提供了一种表示表单数据的键值对的方法
res.body.getReader()ReadableStreamDefaultReader读取大量数据、流式处理数据,边读边处理用于按块读取数据,适用于流式数据处理和大型文件读取