vue中axios的二次封装

1. 如果对axios不了解的可以先移步中文axios网

axios中文文档|axios中文网 | axiosicon-default.png?t=N7T8http://www.axios-js.com/zh-cn/docs/2. 这是稀土掘金上的关于axios的封装个人感觉比较细节易懂

vue中Axios的封装和API接口的管理 - 掘金回归正题,我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护。 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的…icon-default.png?t=N7T8https://juejin.cn/post/6844903652881072141==========================华丽分割线=================================

以下是我在实际开发中的使用:

1. 文件目录  base.ts  是axios封装的核心文件

 2, requestOptions文件(import { ContentType } from "./requestOptions"

export const enum ContentType {
  json = "application/json;charset=UTF-8",
  form = "application/x-www-form-urlencoded; charset=UTF-8",
  download = "application/octet-stream",
  upload = "multipart/form-data"
}

3.getRequestErrorMsg(import { getRequestErrorMsg } from "@/pc/utils"

/**
 * 获取网络错误
 * @param e
 * @param defaultRet
 */
export function getRequestErrorMsg(e, defaultRet = "网络开小差,请稍后再试") {
  return e && e.data && e.data.data ? e.data.data : defaultRet;
}

3. base.ts文件内容

/* eslint-disable */
import EventBus from "@/pc/eventBus";
import { Message } from "element-ui";
import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
import { ContentType } from "./requestOptions";
import _ from "lodash";
import qs from "qs";
import { getRequestErrorMsg } from "@/pc/utils";

const TIME_OUI = 300 * 1000; // 超时
const TOKEN = "TOKEN"; // token键值
const baseURL = "/api"; // api前缀

const baseOptions: AxiosRequestConfig = {
  baseURL: baseURL,
  timeout: TIME_OUI,
  withCredentials: true, // 不论是否跨域,都发送cookies
  headers: {
    "Content-Type": ContentType.json
  }
};

const service = axios.create(baseOptions);

// 请求拦截
service.interceptors.request.use(
  config => {
    // 如果有token,加上token
    const token = sessionStorage.getItem(TOKEN);
    if (token) {
      config.headers.token = token;
    }
    return config;
  },
  error => {
    console.error("request error", error);
    Promise.reject(error);
  }
);

let loginMessage = false;
// 返回拦截
service.interceptors.response.use(
  async res => {
    // response interceptors cookies拦截器,存入token
    if (res.headers["set-token"]) {
      const token = res.headers["set-token"];
      sessionStorage.setItem(TOKEN, token);
    }
    // const responseType: string = res.config.responseType as string;
    // if (responseType === "blob") {
    //     return res;
    // }
    // return res.data;
    return res;

}, (error) => {
    return Promise.reject(error ? error.response : "未知错误");
  }
);
const ErrorTimeOut = 10 * 1000;
const baseRequest = (requestOptions, notifyIfError = false, messageOpt = {}) => {
  return new Promise((resolve, reject) => {
    service(requestOptions)
      .then((res: AxiosResponse<{ code: number; message: string; data: any }>) => {
        const responseType: string = res.config.responseType as string;
        if (responseType === "blob") {
          resolve(res.data);
        }
        // 统一处理业务级别的错误字段 code
        else if (res.data && res.data.code && res.data.code != 200) {
          res.data.message && EventBus.$emit("errorNotify", res.data.message || "未知错误,请稍后重试");
          reject(res.data);
        } else {
          resolve(res.data.data);
        }
      })
      .catch(e => {
        const status = e && e.status;
        let errorMsg = "请求失败,请稍后重试";
        if (e && e.data && e.data.data) {
          errorMsg = e.data.data;
        }
        // 处理导出时blob错误信息(1层)
        if (e && e.config && e.config.responseType === "blob") {
          let reader = new FileReader();
          reader.readAsText(e.data, "utf-8");
          reader.onload = function() {
            Message({
              message: JSON.parse(this.result as string)?.data || "未知错误",
              type: "error",
              duration: ErrorTimeOut,
              ...messageOpt
            });
          };
          return reject(e);
        }
        switch (+status) {
          case 401:
            if (!loginMessage) {
              Message({
                message: "登录已超时,请重新登录!",
                center: true,
                type: "warning",
                onClose() {
                  loginMessage = false;
                }
              });
              loginMessage = true;
            }
            EventBus.$emit("goLogin");
            return reject(e);
          case 417:
              Message({
                message: errorMsg,
                type: "error",
                duration: ErrorTimeOut,
                ...messageOpt
              });
            return reject(e);
          case 412:
            EventBus.$emit("removeToken", undefined);
            Message({
              message: e.data.data,
              type: "error",
              duration: ErrorTimeOut
            });
            return reject(e);
          case 500:
            Message({
              message: errorMsg,
              type: "error",
              duration: ErrorTimeOut
            });
            return reject(e);
        }
        if (notifyIfError) {
          const msg = getRequestErrorMsg(e);
          EventBus.$emit("errorNotify", msg);
        }
        return reject(e);
      });
  });
};

/**
 * get 请求
 * @param url
 * @param params
 * @param notifyIfError
 * @return Promise
 */
export const fetchGet = (url, params, options = {}, notifyIfError = false) => {
  return baseRequest(
    {
      url,
      method: "get",
      params,
      ...options
    },
    notifyIfError
  );
};

/**
 * post 请求
 * @param url
 * @param data
 * @param params
 * @param options axios 其他配置项
 * @oaram notifyIfError 是否发送系统级错误提示
 * @param messageOpt message提示配置项
 * @return Promise
 */
export const fetchPost = (url, data = {}, params = {}, options = {}, notifyIfError = false, messageOpt = {}) => {
  return baseRequest(
    {
      url,
      method: "post",
      params,
      data,
      ...options
    },
    notifyIfError,
    messageOpt
  );
};

/**
 * patch 请求
 * @param url
 * @param data
 * @param params
 * @return Promise
 */
export const fetchPatch = (url, data = {}, params = {}, notifyIfError = false) => {
  return baseRequest(
    {
      url,
      method: "patch",
      params,
      data
    },
    notifyIfError
  );
};

/**
 * put 请求
 * @param url
 * @param data
 * @param params
 * @return Promise
 */
 export const fetchPut = (url, data = {}, params = {}, notifyIfError = false) => {
  return baseRequest(
    {
      url,
      method: "put",
      params,
      data
    },
    notifyIfError
  );
};

/**
 * delete 请求
 * @param url
 * @param data
 * @param params
 * @return Promise
 */
export const fetchDel = (url, data = {}, params = {}, notifyIfError = false) => {
  return baseRequest(
    {
      url,
      method: "delete",
      params,
      data
    },
    notifyIfError
  );
};

/**
 * download 请求
 * @param url
 * @param data
 * @param params
 * @return Promise
 */
export const fetchDownload = (url, data = {}, params = {}, notifyIfError = false) => {
  return baseRequest(
    {
      url,
      method: "post",
      headers: {
        "Content-Type": ContentType.download,
        responseType: "blob"
      },
      params,
      data,
      responseType: "blob"
    },
    notifyIfError
  );
};

export const fetchUpload = (url, data = {}, params = {}, options = {}) => {
    return baseRequest({
        url,
        method: 'post',
        headers: {
            "Content-Type": ContentType.upload
        },
        params,
        data,
        ...options
    });
}
export default service;

4. 分模块使用

import { fetchGet, fetchPost } from "../../request";

export default {
  //列表
  getIns(data?: Record<string, any>) {
    return fetchPost("/ambondtrade/getIns", data);
  },
  getProductGroup(params) {
    return fetchGet("/trade/getProductGroup", params);
  },
}

5. 该模块导出

import DealInquery from "./DealInquery";
import PmIntentInstruction from "./PmIntentInstruction";

export default {
  ...DealInquery,
  ...PmIntentInstruction
};

6. 所有模块api导出

 7. main.ts中引入

8. api的使用

 this.$api.BondTrade.stopPMInstruction({ insNo: row.insNo }).then(res => {
            this.$message.success(res);
            this.getData(this.aboutBondInfo);
          });

 9. 下载方法使用(fetchDownload

// js文件(用于联调后端的接口)

import { fetchGet, fetchPost, fetchDownload, fetchDel } from "./request";
export function getExceltemp() {
  return fetchDownload("/srpSurvey/brokerAppointment/downloadExcelTemplate");
}

10. 使用


  const data = await getExceltemp();
  downLoadExcel(data, "上传预约模板");

11. downLoadExcel方法(util.ts)

/*文件下载方法*/
export function downLoadExcel(data: Blob, fileName: string) {
  const url = window.URL.createObjectURL(new Blob([data]));
  const link = document.createElement("a");
  link.style.display = "none";
  link.href = url;
  link.setAttribute("download", `${fileName}.xlsx`);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

export function downLoadzip(data: Blob, fileName: string) {
  const url = window.URL.createObjectURL(new Blob([data]));
  const link = document.createElement("a");
  link.style.display = "none";
  link.href = url;
  link.setAttribute("download", `${fileName}.zip`);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

export function downloadFile(data: Blob, fileName: string) {
  const url = window.URL.createObjectURL(new Blob([data]));
  const link = document.createElement("a");
  link.style.display = "none";
  link.href = url;
  link.setAttribute("download", `${fileName}`);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}
export function downloadZip(data: Blob, fileName: string) {
  const url = window.URL.createObjectURL(new Blob([data]));
  const link = document.createElement("a");
  link.style.display = "none";
  link.href = url;
  link.setAttribute("download", `${fileName}.zip`);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

export function downLoadDocument(data: Blob, fileName: string, suffixName: string) {
  const url = window.URL.createObjectURL(new Blob([data]));
  const link = document.createElement("a");
  link.style.display = "none";
  link.href = url;
  link.setAttribute("download", `${fileName}.${suffixName}`);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

12. 上传方的使用 

 //导入
  importCompanyIndicatorVal(params) {
    return fetchUpload("/creditScorecard/importCompanyIndicatorVal", params);
  }


    async handleUpload(file) {
      if (!file) return;
      const formData = new FormData();
      formData.append("file", file.raw);
      formData.append("industry", this.industry);
      this.buttonLoading = 2;
      try {
        await this.$api.CreditScore.importCompanyIndicatorVal(formData);
        this.$message.success("导入成功");
        this.$emit("fresh");
      } finally {
        this.buttonLoading = 0;
      }
    }

13. 以上为使用全过程。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue使用axios进行二次封装的步骤如下所示: 第一步,在项目的`apis`文件夹下创建一个`http.js`文件,用于封装axios的请求方法。在该文件,通过`export`将方法暴露出去,方便在所需页面进行调用。例如,可以创建一个获取用户列表信息的方法`get_users`: ```javascript import http from './index.js' export const get_users = (params) => { return http({ method: "GET", url: "users", params: params }) } ``` 第二步,设置基地址和拦截器。可以使用axios的`create`方法创建一个自定义的axios实例,并在其设置基地址和拦截器。例如: ```javascript import axios from 'axios' const request = axios.create({ baseURL: '基地址1', timeout: 5000 }) request.interceptors.request.use(function (config) { // 在发送请求之前做些什么 return config }, function (error) { // 对请求错误做些什么 return Promise.reject(error) }) request.interceptors.response.use(function (response) { // 对响应数据做点什么 return response.data }, function (error) { // 对响应错误做点什么 return Promise.reject(error) }) ``` 第三步,在页面引入`http.js`文件,并调用自己所配置好的请求方法。可以使用`import`语句引入`http.js`暴露的方法,然后在页面的方法使用`async`和`await`对请求方法进行异步请求,最终可以直接获取到请求的数据信息。例如: ```javascript import { get_users } from '../apis/http.js' export default { props: {}, data() { return {} }, created() { // 在钩子函数调用自定义的getUserList方法 this.getUserList() }, methods: { // 自定义方法调用get_users方法,通过async和await进行异步请求 async getUserList() { // 调用get_users方法并获取请求数据 let { data: res } = await get_users(params) // 在页面上渲染数据 // console.log(res) } }, components: {} } ``` 这样,在Vue就可以使用axios进行二次封装,并通过引入和调用自定义的请求方法来获取数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vueaxios二次封装](https://blog.csdn.net/m0_63905956/article/details/125589282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vueaxios二次封装](https://blog.csdn.net/qq_20623665/article/details/128243379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好喝的西北风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值