Axios的几种不同的responseType处理响应,以及blob与arraybuffer的解析

在使用 Axios 时,你可以通过设置 responseType 选项来指定如何处理响应数据。Axios 提供了几种不同的 responseType 选项,每种选项都会影响响应数据的格式。

以下是这些选项及其示例:

1. responseType: 'json'

这是默认选项,表示将响应数据解析为 JSON 对象。如果响应不是 JSON 格式,Axios 会自动尝试转换。(现代的前后端分离接口一般来说是以json格式来交互)

示例:

axios.get('/api/data').then(response => {console.log(response.data); // JSON 对象}).catch(error => {console.error(error);});

2. responseType: 'text'

此选项将响应数据处理为文本字符串。

示例:

axios.get('/api/text', { responseType: 'text' }).then(response => {console.log(response.data); // 纯文本字符串}).catch(error => {console.error(error);});

3. responseType: 'blob'

此选项将响应数据处理为 Blob 对象,适用于文件下载或图像处理等场景。

示例:

axios.get('/api/file', { responseType: 'blob' }).then(response => {const url = URL.createObjectURL(response.data);const link = document.createElement('a');link.href = url;link.setAttribute('download', 'file.pdf');document.body.appendChild(link);link.click();}).catch(error => {console.error(error);});

或者显示图片

axios.get('/api/file', { responseType: 'blob' }).then(response => {let img:any = document.querySelector('#image');let url  = window.URL.createObjectURL(res.data);img.src = url;img.onload = () => {//等这个img对象完全加载src完毕就删除这个生成的blob对象。window.URL.revokeObjectURL(url)}}).catch(error => {console.error(error);});

4. responseType: 'arraybuffer'

此选项将响应数据处理为 ArrayBuffer 对象,适用于处理二进制数据。

示例:

axios.get('/api/audio', { responseType: 'arraybuffer' }).then(response => {const audioContext = new (window.AudioContext || window.webkitAudioContext)();audioContext.decodeAudioData(response.data, buffer => {const source = audioContext.createBufferSource();source.buffer = buffer;source.connect(audioContext.destination);source.start(0);});}).catch(error => {console.error(error);});

5. responseType: 'document'

此选项将响应数据解析为文档对象(DOM 对象),适用于处理 HTML/XML 文档。

示例:

axios.get('/api/page', { responseType: 'document' }).then(response => {console.log(response.data); // DOM 对象}).catch(error => {console.error(error);});

6. responseType: 'stream'

在 Node.js 环境中使用,表示将响应数据处理为流。适用于大文件下载。

示例:

const fs = require('fs');
const axios = require('axios');axios.get('/api/largefile', { responseType: 'stream' }).then(response => {response.data.pipe(fs.createWriteStream('largefile.txt'));}).catch(error => {console.error(error);});

使用说明

选择合适的 responseType 可以提高应用的效率和性能,尤其在处理大型文件或需要特定数据格式时。确保你选择的 responseType 与服务器返回的数据格式一致,否则可能会导致错误。


ArrayBuffer 是一种通用的、固定长度的二进制数据缓冲区。在 JavaScript 中,ArrayBuffer 通常用于处理原始二进制数据,比如文件内容、音视频数据、图像数据、加密数据等。它是 Web 应用程序中处理大量数据的基础类型之一。

ArrayBuffer 的典型内容

ArrayBuffer 的内容是原始的二进制数据,它不带有任何格式或结构信息。这使得它非常灵活,可以用来存储任何类型的二进制数据。具体的内容取决于数据的来源和用途。例如:

  • 音频数据:可以包含 PCM 编码的音频样本。
  • 图像数据:可以包含图像的像素值。
  • 文件数据:可以包含从文件读取的原始字节。
  • 网络数据:可以包含从网络接收的原始数据包。

示例代码解析

axios.get('/api/audio', { responseType: 'arraybuffer' }).then(response => {const audioContext = new (window.AudioContext || window.webkitAudioContext)();audioContext.decodeAudioData(response.data, buffer => {const source = audioContext.createBufferSource();source.buffer = buffer;source.connect(audioContext.destination);source.start(0);});}).catch(error => {console.error(error);});

示例中的操作解释:

  1. 发送 GET 请求

    • 使用 Axios 向 /api/audio 端点发送 GET 请求。
    • 设置 responseType'arraybuffer',这表示期望收到的响应数据是二进制的 ArrayBuffer 类型。
  2. 创建 AudioContext

    • AudioContext 是 Web Audio API 的一部分,用于在 Web 上处理音频。它提供了多种处理和播放音频的方法。
    • 代码使用 AudioContextwebkitAudioContext(在某些旧版浏览器中)来创建音频上下文实例。
  3. 解码音频数据

    • 使用 audioContext.decodeAudioData() 方法解码从服务器接收到的 ArrayBuffer 音频数据。
    • decodeAudioData() 方法会将 ArrayBuffer 解码为一个 AudioBuffer,后者是 Web Audio API 中的音频数据格式。
  4. 播放音频

    • 创建一个 AudioBufferSourceNode 对象,它是一个音频源节点,可以播放 AudioBuffer 中的数据。
    • 将解码后的 AudioBuffer 设置为音频源节点的缓冲区,并将其连接到音频上下文的目的地(通常是扬声器)。
    • 调用 source.start(0) 开始播放音频。

ArrayBuffer 的常见用途

  • 媒体处理:解码和播放音频、视频数据。
  • 文件处理:读取和写入文件的原始字节内容。
  • 数据转换:将二进制数据转换为其他格式,如文本、图像等。
  • 网络通信:处理低级网络协议的数据包。

通过使用 ArrayBuffer,开发者可以精细地控制数据的处理和转换,适合需要高性能数据操作的应用场景。


Blob 和 ArrayBuffer 确实有一些相似之处,因为它们都可以用来处理二进制数据。然而,它们在使用场景和特性上还是有一些重要的区别:

相似之处

  1. 二进制数据存储:Blob 和 ArrayBuffer 都可以用于存储和传输二进制数据,比如图像、音频、视频等文件内容。
  2. 浏览器支持:两者在现代浏览器中都有很好的支持,可以通过 JavaScript 进行操作。

不同之处

1. 创建方式与数据类型
  • Blob

    • Blob(Binary Large Object)是一个文件状的对象,主要用于存储大量的二进制数据。
    • 它可以包含任意数量的 ArrayBufferUint8Array 等类型的数据,并且可以设置 MIME 类型。
    • Blob 通常用于表示和处理不可变的、类文件的数据,如图像、视频等。
  • ArrayBuffer

    • ArrayBuffer 是一种通用的、固定长度的二进制数据缓冲区。
    • 它不能直接表示具体的文件类型,更像是一块原始的内存空间。
    • 主要用于处理低级数据操作,如音频处理、加密解密、数据解析等。
2. 特性
  • Blob

    • Blob 是不可变的,也就是说,一旦创建就不能修改其内容。可以通过切片 (slice()) 方法创建一个新的 Blob。
    • 它可以直接用来创建 URL(通过 URL.createObjectURL()),方便在 Web 页面上使用,例如在 <img> 标签中显示图片。
    • 支持获取数据大小和 MIME 类型等属性。
  • ArrayBuffer

    • ArrayBuffer 是可变的,可以直接读取或写入其内容,通过视图对象(如 Uint8ArrayDataView 等)操作。
    • 主要用于处理需要直接访问和修改二进制数据的场景。
    • 没有内建的 MIME 类型或大小属性,需要额外的逻辑来处理这些信息。
3. 典型使用场景
  • Blob

    • 适用于文件上传、下载、展示等场景,如用户上传的图像、生成 PDF 文件等。
    • 通过 XHR 请求或 Fetch API 获取数据时,也常用来表示服务器返回的二进制文件。
  • ArrayBuffer

    • 适用于需要精细控制的二进制数据处理场景,如解析自定义数据格式、处理音视频解码、加密算法等。
    • 在 WebSocket 或其他二进制协议通信中,也常用来表示传输的数据。

总结

  • 虽然 Blob 和 ArrayBuffer 都可以用于处理二进制数据,但它们的设计目标和使用场景有所不同。
  • Blob 更像是一个高层次的二进制文件容器,适合处理文件和数据块,而 ArrayBuffer 是一个底层的二进制数据结构,更适合需要直接操作字节的场景。
  • 根据具体需求选择合适的数据类型,可以更有效地处理和优化数据操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

App测试分发的秘密:如何让你的应用程序快速上线

App测试分发的重要性 在移动应用程序的开发过程中&#xff0c;测试分发是一个非常重要的环节。它可以帮助开发者快速地将应用程序推广到目标用户手中&#xff0c;收集反馈&#xff0c;进行bug修复和优化&#xff0c;从而提高应用程序的质量和用户体验。但是&#xff0c;测试分…

linux脚本:自动检测的bash脚本,用于检查linux的系统性能

目录 一、要求 二、脚本介绍 1、脚本内容 2、解释 3、使用方法&#xff1a; &#xff08;1&#xff09;脚本文件 &#xff08;2&#xff09;赋予权限 &#xff08;3&#xff09;执行结果 三、相关命令介绍 1、top &#xff08;1&#xff09;定义 &#xff08;2&…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑&#xff0c;修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

2.4GHz射频前端集成芯片:AT2401C芯片中文资料

关于AT2401C的基本资料&#xff1a; AT2401C是一款面向Zigbee&#xff0c;无线传感网络以及其他2.4GHz频段无线系统的全集成射频功能的射频前端单芯片。 那么射频放大器的作用是什么&#xff1f;它是用来放大来自射频信号源的低功率信号&#xff0c;放大到较高的功率后&#xf…

7. 运行时数据区-栈

栈的分类 栈分为Java虚拟机栈还有本地方法栈&#xff1a; Java虚拟机栈&#xff1a;用于保存Java中的方法相关的内容本地方法栈&#xff1a;用于保存在Java中使用native 标记的用C来实现方法 由于hotspot的作者发现使用一个栈就可以保存以上两个部分的内容&#xff0c;所以在…

学习测试14-实战3-复习-使用CANoe打开半成品

数据 链接: https://pan.baidu.com/s/1k0SFq0luDvEbqimFgtfyKg?pwd9a5t 提取码: 9a5t 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1&#xff0c;导入信号、报文、节点 2&#xff0c;导入数据库 3&#xff0c;导入can代码 4&#xff0c;导入环境变量 5&#x…

CTF竞赛介绍以及刷题网址(非常详细)零基础入门到精通,收藏这一篇就够了

前言 CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今…

【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code,开发必备

0. 前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;远程连接 Linux 服务器进行开发和维护已成为一种常态。对于使用Windows系统的开发者来说&#xff0c;掌握如何通过 SSH 安全地连接到 Linux 服务器&#xff0c;并利用 VS Code 编辑器进行开发&#xff0c;是一项必备…

海外问卷调查这个项目怎么样?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲海外问卷调查这个项目怎么样&#xff1f;我自己做这个项目已经有三四年的时间了&#xff0c;在这个行业里算是资深玩家&#xff0c;我自己的工作室也一直稳定在操作这个项目&#xff0c;首先可以肯定的是&#xff0c;这个…

<数据集>棉花识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13765张 标注数量(xml文件个数)&#xff1a;13765 标注数量(txt文件个数)&#xff1a;13765 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Partially opened, Fully opened boll, Defected boll, Flower] 序…

甄选范文“论企业集成架构设计及应用”软考高级论文,系统架构设计师论文

论文真题 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture,EIA) 是企业集成平台的核心,也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样,早期的集成方式是通过…

仕考网:公务员可以报考军队文职吗?

公务员可以报考军队文职考试&#xff0c;但是需要满足前提条件。 对于已经与国家、地方的用人单位建立劳动关系的社会人才&#xff0c;在获得当前用人单位的许可后才可以申请报考。 在面试过程中&#xff0c;考生必须出示一份由其用人单位出具的且加盖公章的同意报考证明。一…

远程文件下载

在本机启动 http 服务&#xff0c;在你要下载文件的目录下输入 cmd &#xff0c;运行 python -m http.server前提条件&#xff1a;本机安装了 python 服务。 查看本机 IP&#xff08;无线局域网 IP&#xff09;&#xff0c;重新开一个窗口&#xff0c;查看本机 IP 地址。 ipc…

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation 一、前言Abstract1 Introduction2 Related Work3 Methodology3.1 Preliminary of Latent Diffusion Models3.2 The model variants of Latte3.3 The empirical analysis of Latte3.3.1 Latent video c…

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见&#xff1a;C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中&#xff0c;这个数组该如何定义…

C++中的依赖注入

目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式&#xff0c;它允许我们在不直接创建对象的情况下为对象提供其依赖项&#xff1b;它通过将…

云仓技术带来的物流变革影响

1、实时可视性&#xff1a; 云仓技术使物流公司能够实时跟踪和监控货物在供应链中的位置和状态。这种实时可视性提供了更好的货物追踪和管理能力&#xff0c;同时也提高了客户服务的质量。 ———————————————————— 2、仓储优化&#xff1a; 云仓技术可以…

从0开始搭建vue + flask 旅游景点数据分析系统(四):编写前端首页【数据驾驶舱】

本期我们编写数据驾驶舱页面(Dashboard)这个页面。主要任务是引入echarts 组件编写数据驾驶舱页面。 视频教程后续会更新在我的B站&#xff1a;https://space.bilibili.com/1583208775?spm_id_from666.25.0.0 推荐从教程第一集开始从零开始学习&#xff1a;https://blog.csdn…

实验室责任人员管理保障实训系统安全

在智慧校园的实训管理生态中&#xff0c;实验室责任人员的角色犹如精密机器中的关键齿轮&#xff0c;他们不仅是实验室安全与高效运转的守护者&#xff0c;更是实训教学质量的直接塑造者。这一角色的重要性&#xff0c;在智慧校园的数字化转型中得到了前所未有的凸显&#xff0…

Linux系统配置STM32的开发环境(代码编辑,编译,下载调试)

常见的stm32开发都是直接使用keil-MDK工具的&#xff0c;这是个集成开发环境&#xff0c;包含了代码编辑&#xff0c;编译&#xff0c;下载&#xff0c;调试&#xff0c;等功能&#xff0c;而且keil还是个图形化操作工具&#xff0c;直接可以点击图标案件就可以实现编译下载啥的…