axios下载接口后端返回了json但前端得到的是blob
背景:
通过axios下载文件,正常情况下后端返回内容blob,前端接收并导出文件。但有时候,后端业务逻辑需要提示错误,于是返回json,但前端预期接收的是blob,所以导出去的文件内容是json字符串。
原因:
axios请求头配置了响应格式 responseType: 'blob'
const service = axios.create({ baseURL: '/' })
// 导出用户列表 export function exportUserList(data){ return request({ url: '/admin/accelerate/duration/download', method: 'post', responseType: 'blob', // 指定响应内容为blob data }) }
解决方法:
在axios响应拦截器中,判断请求的响应类型。若预期返回blob但实际返回json,则将blob转成json字符串,然后进行错误提示。
// blob转字符串 export const blobTojsonstr = (blob) => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => resolve(e.target.result); reader.onerror = (e) => reject(e.target.error); reader.readAsText(blob); }); }
import { Notification } from 'element-ui' // HTTP response 拦截 service.interceptors.response.use( async (res) => { const status = res.status const responseType = res.config.responseType // 预期响应数据类型 const contentType = res.headers['content-type'] // 真实响应数据类型 let resData = null, isBlob = ['arraybuffer', 'blob'].includes(responseType) if (!isBlob) { // 预期是非文件,即json resData = res.data } else { // 预期是文件 if (contentType.indexOf('application/json') > -1) { // 下载接口异常:Blob转Json后解密 isBlob = false try { const content = await blobTojsonstr(res.data) resData = JSON.parse(JSON.parse(content).data) } catch (error) { resData = res.data } } else { resData = res.data } } // 不正确的状态码进行统一处理 if (!isBlob && (status !== 200 || resData.code !== 0)) { const errMsg = resData.msg Notification.error({ title: errMsg }) return Promise.reject(new Error(errMsg)) } return resData }, (error) => { return Promise.reject(new Error(error)) } )
效果:
正常情况下,后端返回blob,axios接收blob并导出文件。
异常情况下,后端返回json,axios接收blob后转成json,根据错误码code提示错误。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!