API导出XLS文件异常:响应乱码但Swagger下载正常求助
API导出XLS文件返回乱码,Swagger下载正常的问题排查
问题现象
调用API导出XLS文件时,响应返回一串乱码字符,无法正常解析为Excel文件,但在Swagger中点击下载按钮却能正常获取并打开文件。已尝试修改downloadDocFile和handleExport函数,问题仍未解决。
相关代码
function downloadDocFile(data: Blob, ext = 'xlsx', name = 'Export'): void { const downloadUrl = window.URL.createObjectURL(new Blob([data])) const link = document.createElement('a') link.href = downloadUrl link.setAttribute('download', `${name}-${DateTime.now().toLocaleString()}.${ext}`) document.body.appendChild(link) link.click() link.remove() } const loading = useLoading() function handleExport() { loading.show() const url = `/bill-of-material/${bomItems.value[0]?.billOfMaterialId}/available-kits/export-xls` getApiInstance('kitting') .post(url, { responseType: 'blob' }) .then((data: any) => { if (data) { downloadDocFile(data) } loading.hide() }) }
可能的问题原因及解决方案
responseType参数位置错误
多数HTTP客户端库(如Axios)中,responseType属于请求配置项,需放在第三个参数的配置对象中,而非第二个参数(请求体)。当前代码把{ responseType: 'blob' }当作POST请求的data传递,导致请求未正确设置响应类型,服务器返回的二进制数据被当作字符串解析,出现乱码。
修改示例:getApiInstance('kitting') .post(url, {}, { responseType: 'blob' }) // 空对象作为POST请求体,配置项放第三个参数 .then((response) => { if (response.data) { // Axios响应数据存在于response.data中 downloadDocFile(response.data) } loading.hide() })响应数据被自动解析为字符串
若客户端库默认将响应解析为UTF-8字符串,即使设置了responseType也可能出现乱码。可尝试将乱码字符串转换回Blob:// 若data是乱码字符串,强制转换为Blob const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) downloadDocFile(blob)缺失必要请求头
Swagger发起请求时可能自动携带了Accept: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这类请求头,而你的代码未设置,导致服务器返回了非预期格式的响应。可手动添加请求头:getApiInstance('kitting') .post(url, {}, { responseType: 'blob', headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' } }) .then(...)全局拦截器修改了响应
检查getApiInstance返回的实例是否存在全局响应拦截器,可能拦截器将Blob数据转换为了字符串。可临时禁用拦截器测试,或在拦截器中判断导出接口的URL,跳过数据转换逻辑。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

