Axios 二次封装详解

[复制链接]
发表于 2024-11-19 22:32:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Axios 二次封装详解

在前端开发中,常常须要对网络请求进行一些定制化的处理。以下是关于一个 Axios 二次封装的详细介绍。
我一般把以下代码放到utils目录下创建request.js文件,以下是部分关键代码示例:
  1. //引用axios实例
  2. import axios from 'axios';
  3. //引入配置
  4. import config from '../api/confing';
  5. //引入弹窗
  6. import { ElMessage }from 'element-plus';
  7. //引入路由,主要用于跳转
  8. import router from '../router';
  9. //引入缓存,主要用于token处理
  10. import storage from './storage';
  11. const TOKEN_INVALID = 'Token 认证失败,请重新登陆!';
  12. const NETWORK_ERROR = '网络请求异常,请稍后重试!';
  13. // 创建 axios 实例对象,添加全局配置
  14. const service = axios.create({
  15.     baseURL: config.baseApi,
  16.     timeout: 8000
  17. });
  18. // 请求拦截
  19. service.interceptors.request.use(
  20.     config => {
  21.         // 获取用户信息
  22.         var userinfo = storage.getItem("userInfo");
  23.         if (typeof(userinfo) == "undefined" || userinfo == '' || userinfo == null) {
  24.         } else {
  25.             config.headers['token'] = userinfo.token
  26.         }
  27.         return config
  28.     },
  29.     error => {
  30.         console.log(error); // for debug
  31.         return Promise.reject(error)
  32.     }
  33. );
  34. // 响应拦截
  35. service.interceptors.response.use((res) => {
  36.     const { code, data, msg } = res.data;
  37.     // 示例判断代码
  38.     if (code === 1) {
  39.         return data
  40.     } else if (code === 40001 || code === 40003) {
  41.         ElMessage.error(msg);
  42.         setTimeout(() => {
  43.             router.push('login')
  44.         }, 150);
  45.         return Promise.reject(TOKEN_INVALID)
  46.     }  else if (code == 0) {
  47.         ElMessage.error(msg);
  48.         // 处理特殊情况的数据
  49.     } else {
  50.         ElMessage.error(msg || NETWORK_ERROR);
  51.         return Promise.reject(msg || NETWORK_ERROR)
  52.     }
  53. });
  54. // 请求核心函数
  55. function request(options) {
  56.     options.method = options.method || 'get';
  57.     if (options.method.toLowerCase() === 'get') {
  58.         options.params = options.data;
  59.     }
  60.     let isMock = config.mock;
  61.     if(typeof options.mock!= 'undefined'){
  62.         isMock = options.mock;
  63.     }
  64.     if (config.env == 'production') {
  65.         service.defaults.baseURL =  config.mockApi
  66.     } else if (config.env === 'prod') {
  67.         service.defaults.baseURL = config.baseApi
  68.     } else {
  69.         service.defaults.baseURL = isMock? config.mockApi : config.baseApi
  70.     }
  71.     return service(options);
  72. }
  73. ['get', 'post', 'delete', 'patch'].forEach((item) => {
  74.     request[item] = (url, data, options) => {
  75.         return request({
  76.             url,
  77.             data,
  78.             method: item,
  79.            ...options
  80.         })
  81.     }
  82. });
  83. export default request;
复制代码
通过如许的二次封装,我们能够更加机动和方便地进行网络请求的管理和处理,提高了开发服从和代码的可维护性。
以上就是关于这个 Axios 二次封装的简单介绍,盼望对各人明白网络请求的处理有所资助。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表