翼度科技»论坛 编程开发 JavaScript 查看内容

前端如何相对优雅管理api

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一般来说,项目由子模块组成,拿到后端提供过来的接口,一般也是按照子模块来分类提供的.请教一下各位,你们前端项目是如何管理api的?
希望各位贴点你们的优秀代码段上来学习学习.
 
常见:
各个模块的api存放到单独的js文件里,返回一个请求实例promise对象
使用的时候根据需求引入相应的请求方法
  1. // axios/request.js 文件:<br>
  2. /* 创建axios请求实例,并返回实例 代码就不贴上来了*/
复制代码
  1. // axios/apis/home.js 文件:
  2. import request from "../request";
  3. //获取菜单
  4. export function getHomeNav(params) {
  5.   return request({
  6.      url: "/api/home/getNav",
  7.      params: params
  8.    });
  9. }
  10. //获取热门新闻
  11. export function getHotNewsList(params) {
  12.    return request({
  13.      url: "/api/home/getHotNewsList",
  14.      params: params
  15.    });
  16. }
复制代码
  1. // axios/apis/my.js 文件:
  2.   
  3. // 获取用户信息
  4. export function getUserInfo(params) {
  5.    return request({
  6.      url: "/api/get/user/info",
  7.      params: params
  8.    });
  9. }
  10. // 更新用户信息
  11. export function updateUserInfo(params) {
  12.    return request({
  13.      url: "/api/post/user/update",
  14.      data: params
  15.    });
  16. }
复制代码
  1. // 使用文件:
  2. import { getHomeNav, getHotNewsList } from '@/axios/apis/home.js'<br> import { getUserInfo, updateUserInfo} from '@/axios/apis/home.js'
复制代码
  1. getHomeNav({}).then(res=>{
  2.     console.log(res)
  3. });
复制代码
 
个人在某个项目上,烦透了在使用的时候一个个api请求方法引入.花了点时间,改成了所有api直接挂在一个全局变量上.牺牲了点性能,但是使用起来爽歪歪的感觉.
  1. 假如axios/apis/home.js文件:
  2. export default {
  3.     //获取菜单
  4.     nav: {
  5.         url: "/api/home/getNav",
  6.         method: "get",
  7.         config:{timeout:50000} // 会覆盖到axios实例的config对应的属性
  8.     },
  9.     body: {
  10.         //getHotNewsList
  11.         getHotNewsList: {
  12.             url: "/api/home/getHotNewsList",
  13.             method: "get",
  14.         },
  15.         //getList
  16.         getList: {
  17.             url: "/api/home/getList",
  18.             method: "get",
  19.         },
  20.     },
  21. };
复制代码
 全局引入所有API:
 import requireApi from '@/axios/index.js'
 const APIS  = requireApi();
 home里的api调用可以这样:
 APIS.home.nav({page:1,sizePages:20}).then(res=>{ ... })
 APIS.home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
假如另外有一个my的模块api,使用起来可以这样:
APIS.my.xxxx().then(res=>{ ... });
 下面是实现代码段:
  1. // 假如目前有两个模块的api,分别存放在home.js,my.js里<br>
复制代码
  1. // axios/apis/home.js文件:<br>export default {
  2.   //获取菜单
  3.   nav: {
  4.     url: "/api/home/getNav",
  5.     method: "get",
  6.     config:{timeout:50000} // 会覆盖到axios实例的config对应的属性
  7.   },
  8.   body: {
  9.     //getHotNewsList
  10.     getHotNewsList: {
  11.       url: "/api/home/getHotNewsList",
  12.       method: "get",
  13.     },
  14.     //getList
  15.     getList: {
  16.       url: "/api/home/getList",
  17.       method: "get",
  18.     },
  19.   },
  20. };
复制代码
  1. [/code][code]// axion/apis/my.js文件:<br>export default {
  2.   // 获取用户信息
  3.   getUserInfo: {
  4.     url: "/api/get/user/info",
  5.     method: "get",
  6.   },
  7.   // 更新用户信息
  8.   updateUserInfo: {
  9.     url: "/api/post/user/update",
  10.     method: "post",
  11.   },
  12. };
复制代码
 
 
  1. // axios/index.js 文件:
  2. import createApiFn from "./createApiFn";
  3. /**
  4. *  把api文件夹下的所有Api文件require进来,在逐个export出去
  5. *  假如axios/apis/home.js文件:
  6.         export default {
  7.             //获取菜单
  8.             nav: {
  9.                 url: "/api/home/getNav",
  10.                 method: "get",
  11.                 config:{timeout:50000} // 会覆盖到axios实例的config对应的属性
  12.             },
  13.             body: {
  14.                 //getHotNewsList
  15.                 getHotNewsList: {
  16.                     url: "/api/home/getHotNewsList",
  17.                     method: "get",
  18.                 },
  19.                 //getList
  20.                 getList: {
  21.                     url: "/api/home/getList",
  22.                     method: "get",
  23.                 },
  24.             },
  25.         };
  26. *  按需求引入:
  27. *  import { home } from '@/axios/index.js'
  28. *  home.nav({page:1,sizePages:20}).then(res=>{ ... })
  29. *  home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
  30. *
  31. *  全局引入所有API:
  32. *  import requireApi from '@/axios/index.js'
  33. *  const APIS  = requireApi();
  34. *  APIS.home.nav({page:1,sizePages:20}).then(res=>{ ... })
  35. *  APIS.home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
  36. */
  37. /**
  38. // webpack
  39. let requireApi = () => {
  40.   let allApi = require.context("./apis/", false, /\.js$/),
  41.       allApiFnObj = {};
  42.   allApi.keys().map((item) => {
  43.     allApiFnObj[item.replace(/(\.\/|\.js)/g, "")] = createApiFn(allApi(item).default);
  44.   });
  45.   return allApiFnObj;
  46. };
  47. */
  48. // vite
  49. let requireApi = () => {
  50.       let allApi = import.meta.globEager('./apis/*.js'),
  51.           allApiFnObj = {};
  52.       Object.keys(allApi).map((item) => {
  53.         const fileName = item.replace(/\.\/apis\/|\.js/g, '');
  54.         allApiFnObj[fileName] = createApiFn(allApi[item].default);
  55.       });
  56.       return allApiFnObj;
  57.     };
  58. export default requireApi;
  59. // 需要手动把各个模块export出去
  60. let { home, my } = requireApi();
  61. export { home, my };
复制代码
 
  1. // axios/createApiFn.js文件:
  2. import requestInstance from "./request";
  3. const bindPromiseFn = (apiObj, args, config={}) => {
  4.   const params = {
  5.     method: apiObj.method || "get",
  6.     url: apiObj.url,
  7.     params: args,
  8.     config: apiObj.config || {},
  9.   };
  10.   params.config = {
  11.     ...params.config,
  12.     ...config
  13.   }
  14.   return requestInstance(params);
  15. };
  16. /**
  17. * 把apis对象转变成以字段名为方法名的对象
  18. * 如:
  19. * apis={
  20. *   getDemo:{
  21. *      url:"xxxx",
  22. *      method: "get"
  23. *   },
  24. *   postDemo:{}
  25. * }
  26. * 执行方法后返回对象结构如下:
  27. * {
  28. *  getDemo:function(){},
  29. *  postDemo:function(){}
  30. * }
  31. * @param {object} apis
  32. */
  33. const createApiFn = (apis) => {
  34.   var obj = {};
  35.   Object.keys(apis).map((key) => {
  36.     if (apis[key] && apis[key].url) {
  37.       obj[key] = (function (apiObj) {
  38.         /**
  39.          * args 请求入参
  40.          * config 请求配置相关信息,最终会传给实例axios.config
  41.          */
  42.         return function (args,config={}) {
  43.           return bindPromiseFn(apiObj, args, config);
  44.         };
  45.       })(apis[key]);
  46.     } else if ( apis[key] && !apis[key].url && Object.prototype.toString.call(apis[key]) === "[object Object]") {
  47.       obj[key] = createApiFn(apis[key]);
  48.     }
  49.   });
  50.   return obj;
  51. };
  52. export default createApiFn;
复制代码
 
  1. // axios/request.js 文件:
  2. import axios from "axios";
  3. // 创建axios实例
  4. const axiosInstance = (config = {}) => {
  5.   const _config = {
  6.     // baseURL: `${location.protocol}//${process.env.VUE_APP_BASE_API}`, //  `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  7.     timeout: 30000,
  8.   };
  9.   config = {
  10.     ..._config,
  11.     ...config
  12.   };
  13.   return axios.create(config);
  14. };
  15. const requestInstance = (args) => {
  16.   let { method, url, params, config = {} } = args;
  17.   if (!url) {
  18.     return;
  19.   }
  20.   if (method === "get") {
  21.     params = { params: params };
  22.   }
  23.   const instance = axiosInstance(config);
  24.   instance.interceptors.request.use(
  25.     (config) => {
  26.       // config.headers["x-auth-token"] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
  27.       return config;
  28.     },
  29.     (error) => {
  30.       return Promise.reject(error);
  31.     }
  32.   );
  33.   instance.interceptors.response.use(
  34.     (response) => {
  35.       const { status, statusText, data } = response
  36.       if (status === 200 || status === 304) {
  37.         return Promise.resolve(data);
  38.       } else {
  39.         return Promise.reject(statusText || "Error");
  40.       }
  41.     },
  42.     (error) => {
  43.       return Promise.reject(error);
  44.     }
  45.   );
  46.   debugger;
  47.   return instance[method](url, params, config);
  48. };
  49. export default requestInstance;
复制代码
 
  1. //全局引入所有API使用方法:
  2. import requireApi from '../axios/index'
  3. const API  = requireApi();
  4. API.my.updateUserInfo({name:'xiaomou'}).then(res=>{
  5.       console.log(res);
  6. })
  7. APIS.home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
  8. //按需求引入方法:
  9. import { home } from '@/axios/index.js'
  10. home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
复制代码
 
 
 
  

来源:https://www.cnblogs.com/xiaomou2014/p/17200411.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具