axios下载接口后端返回了json但前端得到的是blob

背景:

通过axios下载文件,正常情况下后端返回内容blob,前端接收并导出文件。但有时候,后端业务逻辑需要提示错误,于是返回json,但前端预期接收的是blob,所以导出去的文件内容是json字符串。

原因:

axios请求头配置了响应格式 responseType: 'blob'

javascript 复制代码
const service = axios.create({
    baseURL: '/'
})
javascript 复制代码
// 导出用户列表
export function exportUserList(data){
  return request({
    url: '/admin/accelerate/duration/download',
    method: 'post',
    responseType: 'blob', // 指定响应内容为blob
    data
  })
}

解决方法:

在axios响应拦截器中,判断请求的响应类型。若预期返回blob但实际返回json,则将blob转成json字符串,然后进行错误提示。

javascript 复制代码
// 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);
  });
}
javascript 复制代码
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提示错误。

相关推荐
花开盛夏^.^4 小时前
电脑打开多个浏览器Web窗口占用较大的运行内存的原因
前端·浏览器
馒头不想说话5 小时前
实体店老板的24小时AI运营员工,写、剪、发全自动,省下一整个团队工资
前端
椒哥7 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
风骏时光牛马8 小时前
生成一个AI稳定性治理及疑难问题分析标题,只需要一个标题,不需要其他的任何文本。
前端
莫西干式秃头8 小时前
用 AI + threejs 写了个浏览器里的 3D 动作游戏《武来》:砍怪、放技能、开 SU7
前端·人工智能·three.js
kyriewen8 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员
孟健8 小时前
用 WorkBuddy 做个人名片网页,挂上开源设计技能后效果完全不同了
前端·人工智能·ai编程
IT_陈寒8 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
LuHang9 小时前
从天地图切换到高德地图:一次真实的底图迁移实战
前端·vue.js·cesium
用户360055579009 小时前
Kestrel_VLLM - 27 · 寄存器常驻与融合发射:两次「少发一次」
前端