使用post下载后端返回的excel文件踩的坑。获取到数据之后下载打不开文件,提示格式错误,响应数据类型是application/zip,自己并没有解析出来,但是可以通过curl命令下载下来。折腾一阵之后大佬指点,最后通过在请求接口的响应时候,设置responseType=arrayBuffer,返回的数据使用new Blob([data])创建一个url解决了。在后端返回错误信息按照arraybuffer解析的json数据格式时,在response的catch里 捕获,将arraybuffer数据处理为
JSON.parse(Buffer.from(err.response.data).toString('utf8'));
并返回。就可以解析了。
**XMLHttpRequest.responseType **属性是一个枚举类型的属性,返回响应数据的类型。它允许我们手动的设置返回数据的类型。如果我们将它设置为一个空字符串,它将使用默认的"text"类型。
在工作环境(Work Environment)中将responseType的值设置为"document"通常会被忽略. 当将responseType设置为一个特定的类型时,你需要确保服务器所返回的类型和你所设置的返回值类型是兼容的。那么如果两者类型不兼容呢?恭喜你,你会发现服务器返回的数据变成了null,即使服务器返回了数据。还有一个要注意的是,给一个同步请求设置responseType会抛出一个InvalidAccessError
的异常。
responseType支持以下几种值:
值 | 描述 |
---|---|
"" |
将 responseType 设为空字符串与设置为"text" 相同, 是默认类型 (实际上是 DOMString )。 |
"arraybuffer" |
response 是一个包含二进制数据的 JavaScript ArrayBuffer 。 |
"blob" |
response 是一个包含二进制数据的 Blob 对象 。 |
"document" |
response 是一个 HTML Document 或 XML XMLDocument ,这取决于接收到的数据的 MIME 类型。请参阅 HTML in XMLHttpRequest 以了解使用 XHR 获取 HTML 内容的更多信息。 |
"json" |
response 是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的。 |
"text" |
response 是包含在 DOMString 对象中的文本。 |
"moz-chunked-arraybuffer" |
与"arraybuffer"
相似,但是数据会被接收到一个流中。使用此响应类型时,响应中的值仅在 progress
事件的处理程序中可用,并且只包含上一次响应 progress
事件以后收到的数据,而不是自请求发送以来收到的所有数据。
在 progress
事件处理时访问 response
将返回到目前为止收到的数据。在 progress
事件处理程序之外访问, response
的值会始终为 null
。
|
| "ms-stream"
| response
是下载流的一部分;此响应类型仅允许下载请求,并且仅受Internet Explorer支持。 |