当前位置: 首页 > news >正文

XMLHttpRequest.responseType:前端获取后端数据的一把“格式钥匙”

一、为什么是“钥匙”

浏览器收到 HTTP 响应后,原始形态永远只有两种:

  1. UTF-8 文本流
  2. 二进制字节流

前端真正想要的,可能是 JSON 对象、HTML DOM、Blob 下载链接、ArrayBuffer 纹理……
responseType 就是告诉浏览器:“请先帮我加工好,再交给我。”
不设它,默认只能拿到字符串,后续还得自己 parse、转码、拼 Blob,既啰嗦又容易踩坑。


二、6 种合法值全景图

(按“从文本到裸二进制”顺序,记忆更直观)

拿到的 xhr.response 类型一句话场景常见坑
""(默认)String老式接口返回 JSON 字符串忘记 JSON.parse 就直接当对象用,报 .map is not a function
"text"String同上,显式版"" 完全等价,只是可读性更好
"json"已 parse 的 JS 对象/数组REST、GraphQL、JSONP 模拟后端多写了个 BOM,parse 失败→response===null,不会抛错!
"document"HTML/XML DOM拉取页面片段、SVG 图标非 XML 会返回 null;需要 xhr.response.documentElement
"blob"Blob下载图片、音视频、Excel旧 Android 4.4 以下不支持,需降级 "arraybuffer"new Blob([buf])
"arraybuffer"ArrayBufferWebGL 纹理、音频解码、WebAssembly不带 MIME,手动 new Blob([buf], {type}) 才能生成 URL

三、一条时间线:从 XML 时代到二进制时代

  • 2006 年以前:只有 """document",世界全是 XML。
  • 2008:XHR2 草案加入 "json""blob""arraybuffer",支持 Ajax 上传下载文件。
  • 2012:Chrome 23 率先稳定支持全部 6 种值;IE10 跟进,IE9 及以下仅支持前 4 种。
  • 2020:HTTP/2 普及,二进制帧+服务器推送,让 "arraybuffer"/"blob" 用得更加频繁。

四、正确姿势 3 步法

  1. open() → 2. 再设 responseType → 3. 最后 send()
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/export');   // 1
xhr.responseType = 'blob';        // 2 关键点
xhr.onload = () => {if (xhr.status === 200) {const url = URL.createObjectURL(xhr.response); // 已是 Blobconst a = document.createElement('a');a.href = url; a.download = 'report.xlsx';a.click();URL.revokeObjectURL(url);}
};
xhr.send();                       // 3

反例

xhr.send();               // ❌ 先发了
xhr.responseType = 'json' // ❌ 后设置,部分浏览器直接抛 InvalidStateError

五、跨域阴影:CORS 与 responseType 的隐藏限制

  • 请求是 跨域 且服务器 返回 Access-Control-Allow-Origin:* 时,
    浏览器只允许 """text",其余值会抛 DOMException: InvalidAccessError
  • 解决方案:
    1. 让后端加 Access-Control-Allow-Origin
    2. 或者走同源代理 / 网关转发

六、调试锦囊

症状检查点
response === null1. 后端实际格式与 responseType 不符 2. JSON 含 BOM/语法错误
responseText 是空字符串你设了 "blob"/"arraybuffer",浏览器不再保存文本副本
文件下载后损坏后端返回 Content-Type: application/octet-stream 但用 "text" 接收,UTF-8 解码破坏二进制

七、与 Fetch 的“对照表”

XHR responseType      Fetch 等价写法
"" | "text"          await res.text()
"json"               await res.json()
"blob"               await res.blob()
"arraybuffer"        await res.arrayBuffer()
"document"           无,需要 new DOMParser()

八、总结一句话

responseType 是 XMLHttpRequest 对“解析脏活”的封装。
选对了,后端数据一行代码就能用;选错,调试两小时起步。
记住顺序:先 open(),再设类型,最后 send()——
这把“格式钥匙”就算握稳了。

http://www.dtcms.com/a/490543.html

相关文章:

  • office便捷办公06:根据相似度去掉excel中的重复行
  • Vue+mockjs+Axios 案例实践
  • http的发展历程
  • Python中使用HTTP 206状态码实现大文件下载的完整指南
  • AngularJS下 $http 上传文件
  • 如何弄死一个网站锡林郭勒盟建设工程造价管理网站
  • 【Node.js】为什么擅长处理 I/O 密集型应用?
  • 基于SpringBoot的无人机飞行管理系统
  • STM32的HardFault错误处理技巧
  • Tekever-固定翼无人机系统:模块化垂直起降、远程海上无人机、战术 ISR 无人机
  • Kafka Queue: 如何严格控制消息数量
  • 大兴建设网站wordpress 托管主机
  • 国外html响应式网站网站开发高级证
  • 苍穹外卖--04--Redis 缓存菜品信息、购物车
  • 大淘客网站如何做seowordpress o2o主题
  • 机器学习催化剂设计专题学习
  • (六)机器学习之图卷积网络
  • 告别刀耕火种:用 Makefile 自动化 C 语言项目编译
  • 【安卓开发】【Android】做一个简单的钢琴模拟器
  • C#控制反转
  • 【Java 开发日记】什么是线程池?它的工作原理?
  • 黄页网站数据来源wordpress 最新漏洞
  • 如何评价3D高斯泼溅(3DGS)技术为数字孪生与实时渲染带来的突破性进展?
  • 技术解析:如何将NX(UG)模型高效转换为3DXML格式
  • 阿里云智能建站网络类黄页
  • SAP MIR7 模拟过账没有这个按钮
  • Redis 分布式锁实战:解决马拉松报名并发冲突与 Lua 原子性优化
  • 光刻胶化学基础:聚合物分子量分布对分辨率的影响与控制,以及国内技术突破
  • Lua C API 中的注册表介绍
  • 广州做网站哪家公司最好wordpress html调用php