axiosClient的使用经验

你还在手撕http的Api吗?axiosClient让你的Api更简洁

介绍一款我最近一直在用的request Api,虽然很小众,但是很好用。当时leader推荐的原因是为了统一处理请求错误(然而感觉并没多少改善),以及传参方式的痛点的。

axios-client npm地址

首先我们引入axios和axiosClient

js 复制代码
import axios from 'axios';
import AxiosClient from '@cn-src/axios-client';
import { message } from 'ant-design-vue';
import { getToken } from '/@/utils/auth';
import { useUserStore } from '/@/store/modules/user';
import { router } from '/@/router';
import { debounce } from 'lodash-es';
axios.interceptors.request.use(
  (config) => {
    if (config.url !== '/login') {
      const AccessToken = getToken(); 
      config.headers.Authorization = 'Bearer ' + AccessToken;
    }
    return config;
  },
  function (error) {
    return Promise.reject(error);
  },
); 
const axiosClient: any = new AxiosClient(axios, {
  baseURL: import.meta.env.DW_GLOB_API_URL,
  timeout: 5000,
  onCatch(_, error) {
    if (!error.response) {
      return debounce(message.error('服务暂不可用,请稍后再试!'), 400);
    }
    if (error.response.status === 401) {
      const userStore = useUserStore();
      userStore.setToken(undefined);
      userStore.setSessionTimeout(false);
      userStore.setUserInfo(null);
      router.push('/login');
    }
    return debounce(returnErrMessage(error), 400);
  },
  // 处理请求空值
  onGet: {
    onPre(req) {
      for (const key in req.params) {
        if (req.params[key] == undefined || req.params[key] == '' || req.params[key] == null) {
          delete req.params[key];
        }
      }
      return true;
    },
  },
});
function returnErrMessage(error) {
  message.error(error.response.data.message || error.response.statusText);
  return;
} 

拦截器我们做了最简单的token拼接,登陆过期退出登录,请求参数不存在时不传参,以及对一些报错提示信息的处理,因为当用户在看板页面登录过期之后会有很多的报错提示所以我们加了lodash的debounce事件。

这些只是简单的一些处理,相信各位都有比我更好的方案来处理这些,接下来我们看看如何封装每个请求。

js 复制代码
export default {  
  getFunApi: axiosClient.get('/url......'), 
  postFunApi: axiosClient.post('/url......'), 
  uploadFunApi: axiosClient.postFormData('/url......'), 
  deleteFunApi: axiosClient.delete('/url/{id}'), 
  putFunApi: axiosClient.put('/url/{id}'),
  downLoadFunAPi: axiosClient.get('/url......', {
    responseType: 'blob',
  }),
}; 

没错,就那么简洁,是不是看起来一目了然,而且还可以拆分不同的模块;

那么我们看一下传参是如何进行传参的;

js 复制代码
//  首先引入我们的Api
  import Api from '@/api';
//  假如我们需要传递的参数值是 requestData
  const requestData = new Object({})
  
//  GET
  Api.getFunApi({ params: requestData }).then((res) => {
      console.log(res)
  });
  
//  POSAT
  Api.postFunApi({ data: requestData }).then((res) => {
      console.log(res)
  });
  
//  PUT
  Api.putFunApi({ data: requestData, pathVars: { id: idStr } }).then((res) => {
      console.log(res)
  });
  
//  DELETE
  Api.deleteFunApi({ pathVars: { id: idStr } }).then((res) => {
      console.log(res)
  });
  
//  POST_FORM_DATE
// 此时requestData是formData格式
  Api.downLoadFunAPi({ data: requestData }).then((res) => {
      console.log(res)
  });

然后我们也可以对一些比较简单的接口进行更加灵活的封装

js 复制代码
import { axiosClient } from '/@/modules/api/index';

export default {
  exportApiFun: (Api) => {
    return axiosClient.get(Api, {
      responseType: 'blob',
      timeout: 60000,
    });
  },
  uploadApiFun: (Api) => {
    return axiosClient.postFormData(Api, {
      timeout: 60000,
    });
  },
  getPageFun: (Api) => {
    return axiosClient.get(Api);
  }, 
  algorithm_execute: axiosClient.get('/algorithm/execute', {
  //  额外单独配置请求超时时间
    timeout: 60000,
  }),
  uploadHistory_table: async (params) => {
    const urlMap = {
      POI: 'POI',
      renkou: 'POPULATION',
      zhihui: 'GRID_SMART_FOOTPRINT_250',
      jichu: 'GRID_POLYGON_250',
      jiedao: 'GRID_LEVEL',
      quxian: 'GRID_POLYGON_COUNTY',
      GRID_REFRESH: 'GRID_REFRESH',
    };
    return await axiosClient.get('/uploadHistory/table')({
      params: {
        tableType: urlMap[params],
      },
    });
  },
};
相关推荐
原则猫5 小时前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路6 小时前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
裕晟资质规划7 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
ShineWinsu7 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
月夏7 小时前
Vue3 转 React:18 项对照表 + 5 个必踩的坑(附 7 天上手路线)
前端
广州华水科技7 小时前
单北斗GNSS位移监测系统的应用与维护解析
前端
梦曦i8 小时前
uni-storage 0.1.0 发布:TTL过期管理+多实例隔离
前端·storage·uni-app x
猫头_9 小时前
AI 流式传输工程指南:模型吐出半截 JSON,前端如何边收边渲染?
前端·javascript·llm
console.log('npc')9 小时前
第 1 章 项目概述与环境搭建
前端·人工智能·大模型
定栓9 小时前
Webpack迁到Vite第七节(二):全家桶移除 — Babel 全家桶深度分析
前端·webpack·node.js