前端如何相對優雅管理api

来源:https://www.cnblogs.com/xiaomou2014/archive/2023/03/09/17200411.html
-Advertisement-
Play Games

一般來說,項目由子模塊組成,拿到後端提供過來的介面,一般也是按照子模塊來分類提供的.請教一下各位,你們前端項目是如何管理api的? 希望各位貼點你們的優秀代碼段上來學習學習. 常見: 各個模塊的api存放到單獨的js文件里,返回一個請求實例promise對象 使用的時候根據需求引入相應的請求方法 / ...


一般來說,項目由子模塊組成,拿到後端提供過來的介面,一般也是按照子模塊來分類提供的.請教一下各位,你們前端項目是如何管理api的?

希望各位貼點你們的優秀代碼段上來學習學習.

 

常見:

各個模塊的api存放到單獨的js文件里,返回一個請求實例promise對象

使用的時候根據需求引入相應的請求方法

// axios/request.js 文件:
/* 創建axios請求實例,並返回實例 代碼就不貼上來了*/
// axios/apis/home.js 文件:

import request from "../request";
//獲取菜單
export function getHomeNav(params) {
  return request({
     url: "/api/home/getNav",
     params: params
   });
 }
 //獲取熱門新聞
 export function getHotNewsList(params) {
   return request({
     url: "/api/home/getHotNewsList",
     params: params
   });
 }
// axios/apis/my.js 文件:
  
// 獲取用戶信息
 export function getUserInfo(params) {
   return request({
     url: "/api/get/user/info",
     params: params
   });
 }
 // 更新用戶信息
 export function updateUserInfo(params) {
   return request({
     url: "/api/post/user/update",
     data: params
   });
 }
// 使用文件:
 import { getHomeNav, getHotNewsList } from '@/axios/apis/home.js'
import { getUserInfo, updateUserInfo} from '@/axios/apis/home.js'
 getHomeNav({}).then(res=>{
    console.log(res)
 });

 

個人在某個項目上,煩透了在使用的時候一個個api請求方法引入.花了點時間,改成了所有api直接掛在一個全局變數上.犧牲了點性能,但是使用起來爽歪歪的感覺.

假如axios/apis/home.js文件:
export default {
    //獲取菜單
    nav: {
        url: "/api/home/getNav",
        method: "get",
        config:{timeout:50000} // 會覆蓋到axios實例的config對應的屬性
    },
    body: {
        //getHotNewsList
        getHotNewsList: {
            url: "/api/home/getHotNewsList",
            method: "get",
        },
        //getList
        getList: {
            url: "/api/home/getList",
            method: "get",
        },
    },
};
 

全局引入所有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=>{ ... });

  下麵是實現代碼段:
// 假如目前有兩個模塊的api,分別存放在home.js,my.js里
// axios/apis/home.js文件:
export default { //獲取菜單 nav: { url: "/api/home/getNav", method: "get", config:{timeout:50000} // 會覆蓋到axios實例的config對應的屬性 }, body: { //getHotNewsList getHotNewsList: { url: "/api/home/getHotNewsList", method: "get", }, //getList getList: { url: "/api/home/getList", method: "get", }, }, };


// axion/apis/my.js文件:
export default { // 獲取用戶信息 getUserInfo: { url: "/api/get/user/info", method: "get", }, // 更新用戶信息 updateUserInfo: { url: "/api/post/user/update", method: "post", }, };

 

 

// axios/index.js 文件:

import createApiFn from "./createApiFn";
/**
 *  把api文件夾下的所有Api文件require進來,在逐個export出去
 *  假如axios/apis/home.js文件:
        export default {
            //獲取菜單
            nav: {
                url: "/api/home/getNav",
                method: "get",
                config:{timeout:50000} // 會覆蓋到axios實例的config對應的屬性
            },
            body: {
                //getHotNewsList
                getHotNewsList: {
                    url: "/api/home/getHotNewsList",
                    method: "get",
                },
                //getList
                getList: {
                    url: "/api/home/getList",
                    method: "get",
                },
            },
        };

 *  按需求引入:
 *  import { home } from '@/axios/index.js'
 *  home.nav({page:1,sizePages:20}).then(res=>{ ... })
 *  home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
 * 
 *  全局引入所有API:
 *  import requireApi from '@/axios/index.js'
 *  const APIS  = requireApi();
 *  APIS.home.nav({page:1,sizePages:20}).then(res=>{ ... })
 *  APIS.home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })
 */

/**
// webpack
let requireApi = () => {
  let allApi = require.context("./apis/", false, /\.js$/),
      allApiFnObj = {};
  allApi.keys().map((item) => {
    allApiFnObj[item.replace(/(\.\/|\.js)/g, "")] = createApiFn(allApi(item).default);
  });
  return allApiFnObj;
};
*/

// vite
let requireApi = () => {
      let allApi = import.meta.globEager('./apis/*.js'),
          allApiFnObj = {};
      Object.keys(allApi).map((item) => {
        const fileName = item.replace(/\.\/apis\/|\.js/g, '');
        allApiFnObj[fileName] = createApiFn(allApi[item].default);
      });
      return allApiFnObj;
    };

export default requireApi;

// 需要手動把各個模塊export出去
let { home, my } = requireApi();
export { home, my };

 

// axios/createApiFn.js文件:

import requestInstance from "./request";

const bindPromiseFn = (apiObj, args, config={}) => {
  const params = {
    method: apiObj.method || "get",
    url: apiObj.url,
    params: args,
    config: apiObj.config || {},
  };
  params.config = {
    ...params.config,
    ...config
  }
  return requestInstance(params);
};
/**
 * 把apis對象轉變成以欄位名為方法名的對象
 * 如:
 * apis={
 *   getDemo:{
 *      url:"xxxx",
 *      method: "get"
 *   },
 *   postDemo:{}
 * }
 * 執行方法後返回對象結構如下:
 * {
 *  getDemo:function(){},
 *  postDemo:function(){}
 * }
 * @param {object} apis
 */
const createApiFn = (apis) => {
  var obj = {};
  Object.keys(apis).map((key) => {
    if (apis[key] && apis[key].url) {
      obj[key] = (function (apiObj) {
        /**
         * args 請求入參
         * config 請求配置相關信息,最終會傳給實例axios.config
         */
        return function (args,config={}) {
          return bindPromiseFn(apiObj, args, config);
        };
      })(apis[key]);
    } else if ( apis[key] && !apis[key].url && Object.prototype.toString.call(apis[key]) === "[object Object]") {
      obj[key] = createApiFn(apis[key]);
    }
  });
  return obj;
};

export default createApiFn;

 

// axios/request.js 文件:

import axios from "axios";

// 創建axios實例
const axiosInstance = (config = {}) => {
  const _config = {
    // baseURL: `${location.protocol}//${process.env.VUE_APP_BASE_API}`, //  `baseURL` 將自動加在 `url` 前面,除非 `url` 是一個絕對 URL。
    timeout: 30000,
  };
  config = { 
    ..._config, 
    ...config 
  };
  return axios.create(config);
};

const requestInstance = (args) => {
  let { method, url, params, config = {} } = args;
  if (!url) {
    return;
  }
  if (method === "get") {
    params = { params: params };
  }

  const instance = axiosInstance(config);

  instance.interceptors.request.use(
    (config) => {
      // config.headers["x-auth-token"] = getToken(); // 讓每個請求攜帶自定義token 請根據實際情況自行修改
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  instance.interceptors.response.use(
    (response) => {
      const { status, statusText, data } = response
      if (status === 200 || status === 304) {
        return Promise.resolve(data);
      } else {
        return Promise.reject(statusText || "Error");
      }
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  debugger;
  return instance[method](url, params, config);
};

export default requestInstance;

 

//全局引入所有API使用方法:
import requireApi from '../axios/index'
const API  = requireApi();
API.my.updateUserInfo({name:'xiaomou'}).then(res=>{
      console.log(res);
})
APIS.home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })

//按需求引入方法:
import { home } from '@/axios/index.js'
home.body.getHotNewsList({page:1,sizePages:20}).then(res=>{ ... })

 

 

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:本文簡單介紹sequence的使用場景及如何修改sequence的cache值提高性能。 本文分享自華為雲社區《GaussDB(DWS)關於sequence的那些事》,作者:Arrow0lf 。 什麼是sequence sequence,也稱作序列,是用來產生唯一整數的資料庫對象。序列的值按照 ...
  • 導讀 本文將介紹網易數帆在數據治理方面的一些總結和思考。文章將圍繞以下三點展開: 1. 數據治理解決了什麼問題 2. 數據治理體系 3. 淺談數據治理的實現 01數據治理解決了什麼問題 首先看一下數據治理解決了什麼問題,可以總結為六個方面: 1. 數據開發與數據治理脫節 在許多企業中存在這樣一個現象 ...
  • 1 mysql邏輯架構 mysql邏輯架構圖: Mysql伺服器、存儲引擎 是兩個獨立的組件,彼此通過api交互 第一層:連接處理、授權認證、安全管理 第二層:核心服務功能 查詢解析、分析、優化、緩存以及所有的內置函數(日期、時間、數學、加密函數等) 跨存儲引擎的功能:存儲過程、觸發器、視圖等。 第 ...
  • 數據治理是推動大型集團企業轉型升級、提升競爭優勢、實現高質量發展的重要引擎。通過全鏈數據結構化,實現業務對象、業務規則、業務流程數字化,推進全鏈業務深度數字化,夯實數據運營底座。 廈門國貿集團股份有限公司(簡稱“國貿股份”)是國有控股上市公司,同時也是首批全國供應鏈創新與應用示範企業,在“十四五”規 ...
  • 摘要:其實游戲客戶對資料庫的訴求是很明確的,資料庫應當“放心存放心用”。 本文分享自華為雲社區《華為雲GaussDB(for Redis)揭秘第27期:聊聊游戲業務怎麼用高斯Redis》,作者:高斯Redis官方博客。 華為雲資料庫團隊是比較重視技術洞察的,對客戶真實的業務場景也比較看重。年初出差了 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 花家舍 文章來源:GreatSQL社區原創 前文回顧 實現一個簡單的Database系列 譯註:cstack在github維護了一個簡單的、類似 ...
  • 生活中存在同時使用兩個微信的情況,一個工作一個生活,這時希望同時在電腦上登錄兩個賬號。如何做到呢?步驟如下: 右鍵單擊“微信”圖標,選擇屬性,目標框內的路徑就是微信安裝路徑,複製目標框里的內容。 將如下命令複製到 TXT 文件保存,再將該文件重命名,主要是將尾碼名改成“.bat”文件。 @echo ...
  • 好家伙,本篇為做題思考 書接上文 題目如下: 1.請給出下列代碼的輸出結果,並配合"消息隊列"寫出相關解釋 async function foo() { console.log(2); console.log(await Promise.resolve(8)); console.log(9); } ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...