vue基于axios封装拦截器及实现上传下载等功能

封装拦截器:
请求拦截:实现登陆后将所有接口都携带上token,及header中增加identify验证字段等;
响应拦截:增加错误处理代码。

文件instance.js

import axios from 'axios';
import store from '@/store';
import qs from 'qs';

const instance = axios.create({
  baseURL: process.env.VUE_APP_PREFIX_API ? process.env.VUE_APP_PREFIX_API + 'api' : 'api',
  // baseURL: process.env.VUE_APP_MAIN_API ?  process.env.VUE_APP_MAIN_API+ 'api' : 'api',
  paramsSerializer: params => qs.stringify(params, { skipNulls: true }),
});

instance.interceptors.request.use(config => {
  config.headers['csrf-token'] = store.state.token || '';
  config.headers['Content-Type'] = 'application/json';
  config.headers['Accept'] = 'application/json';
  config.headers['identify'] = 'art';

  return config;
});

instance.interceptors.response.use(
  response => response,//此处根据需求可直接返回response.data
  err => {
    const isAuthApi = err.response.config.url.includes('auth');
    // 接口错误时,直接弹框报错。
    if (!isAuthApi && err.response.data.message) {
      store.commit('setSnackbar', {
        timeout: 5000,
        color: 'error',
        text: err.response.data.message,
      });
    }
    return Promise.reject(err);
  }
);

export default instance;

inventory.js (根据需求基于instance.js创建对应的API文件)里面可以包括获取详情,获取列表,修改,新增,上传,下载等基本API操作。

特别注意下载文件时,后端返回的如果是二进制流文件一定要将请求中的 responseType一定要设置为blob ,不然文件下载下来会损坏!!!

import instance from '@/api/instance';
const baseURL = 'brand/api';
export default {
  // 获取品牌库记录list
  getInventoryList(params) {
    return instance.get(`${baseURL}/rope/inventory/list`, { params });
  },
  
	......


  // 导出列表
  exportInventoryList(params) {
    return instance.get(`${baseURL}/rope/inventory/export`, {
      params,
      responseType: 'blob',// responseType一定要设置为blob 不然文件会损坏
      headers: {
        'Content-Type': 'application/json;charset=UTF-8',
      },
    });
  },

  // GET方式下载模板
  exportTemplate() {
    return instance.get('/xx/inventory/download/template', {
      responseType: 'blob',// responseType一定要设置为blob 不然文件会损坏
      headers: {
        'Content-Type': 'application/json;charset=UTF-8',
      },
    });
  },
  //PUT方式 下载zip包
  downloadZipFile(jobId) {
    const url = `${baseUrl}/download/${jobId}`;
    return instance({
      url,
      method: 'PUT',
      responseType: 'blob'
    })

  }
  // 导入模板
  importTemplate(file) {
    return instance.post(`${baseURL}/rope/inventory/import`, file, {
      headers: { 'Content-Type': 'multipart/form-data' },
    });
  },
};

以下代码为vue文件中下载zip包代码仅供参考:
在这里插入图片描述

import JobsAPI from "@/api/.../inventory";// 根据路径引入对应模块的API

在这里插入图片描述

    // 下载zip文件
    downloadFile(jobId) {
      this.tableDownloadLoading = true;
      JobsAPI.downloadZipFile(jobId)
        .then((res) => {
          // console.log(res,'====res')
          const [utf8name, ext] = res.headers["content-disposition"]
            .split("=")[1]
            .split(".");
          const name = decodeURIComponent(utf8name.split("''")[1]); //解析中文名,防止乱码的问题

          const fileName = `${name}.${ext}`;
          const blob = new Blob([res.data]);

          const link = window.URL.createObjectURL(blob);
          const a = document.createElement("a");
          a.style.display = "none";
          a.href = link;
          a.setAttribute("download", fileName);
          a.download && a.setAttribute("target", "_blank");
          document.body.appendChild(a);
          a.click();
          document.body.removeChild(a);
          window.URL.revokeObjectURL(link);
        })
        .catch((error) => {
          snackbar({ msg: error.response.data.message, type: "error" });
        })
        .finally(() => (this.tableDownloadLoading = false));
    },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值