Gateway介面轉發維護

来源:https://www.cnblogs.com/yangchaojie/archive/2022/05/18/16284723.html
-Advertisement-
Play Games

介面轉發調用 問題描述 在開發BI系統的時候,出現了這樣一個不方便的地方。 BI報表所展示的數據是從WMS系統通過API獲取的,而BI系統也有自己的後臺實現了用戶許可權之類的。 那麼現在如果WMS開發了一個新的介面,我就要在BI系統手動寫一個介面,實在很不方便。解決的方法也很簡單,BI系統開發一個AP ...


介面轉發調用

問題描述

在開發BI系統的時候,出現了這樣一個不方便的地方。

BI報表所展示的數據是從WMS系統通過API獲取的,而BI系統也有自己的後臺實現了用戶許可權之類的。

那麼現在如果WMS開發了一個新的介面,我就要在BI系統手動寫一個介面,實在很不方便。解決的方法也很簡單,BI系統開發一個API管理的功能,將WMS介面手動維護進去,包括URL Method Params 等。

BI系統提供一個統一的WMS介面入口,我叫gateway。

前端只請求gateway介面,帶上介面代碼和公司代碼。

Vue Gateway 代碼

const api = {
  gateway (api, params) {
    const formData = new FormData()
    formData.append('params', JSON.stringify(params))
    return new Promise((resolve, reject) => {
      request({
        url: '/gateway/dispatch/' + store.getters.getCompanyCode + '/' + store.getters.getCompanyCode + '-' + api,
        method: 'post',
        data: formData
      })
        .then((resp) => {
          // eslint-disable-next-line no-prototype-builtins
          if (resp.data.hasOwnProperty('ErrorMessages')) {
            window.CIEMIS.$emit('SERVER_ERROR', {
              text: resp.data.ErrorMessages[0]
            })
          }
          resolve(resp.data)
        })
        .catch((err) => {
          // eslint-disable-next-line no-prototype-builtins
          reject(err)
        })
    })
  }
}
 

BI不止為一個公司服務,因此公司代碼是動態獲取的,不同的公司可以動態切換。

BI 後臺實現

    @RequestMapping("/dispatch/{companyCode}/{api}")
    @ResponseBody
    public ResponseData gateway(@PathVariable String companyCode, @PathVariable String api, String params) {
        Company company = companyRepository.findCompanyByCode(companyCode);
        Gateway gateway = gatewayRepository.findGatewayByCode(api);
        if (Objects.isNull(company)) {
            throw new NullPointerException("公司異常");
        }
        if (Objects.isNull(gateway)) {
            throw new NullPointerException("沒有維護API");
        }

        String url = company.getWebAddress() + gateway.getUrl();
        Map<String, String> paramsMap = new HashMap<>();
        // 驗證介面參數一致性
        JSONArray array = JSONArray.parseArray(gateway.getParams());
        JSONObject paramsObj = JSONObject.parseObject(params);
        for (int i = 0; i < array.size(); i++) {
            String paramName = array.getJSONObject(i).getString("name");
            if (Objects.isNull(paramsObj.getString(paramName))) {
                throw new ServiceException(500, "gateway參數校驗失敗");
            }
            paramsMap.put(paramName, paramsObj.getString(paramName));
        }
        String result;
        try {
            if (gateway.getMethod().equals("POST")) {
                result = OkHttpUtil.sendPostRequest(url, paramsMap).body().string();
            } else {
                result = OkHttpUtil.get(url, paramsMap).body().string();
            }
        } catch (IOException e) {
            throw new ServiceException(500, "gateway IO Exception: " + e.getMessage());
        }
        Object o = JSON.parse(result);
        if (o instanceof JSONArray) {
            return ResponseData.success(200, "OK", JSON.parseArray(result));
        } else {
            return ResponseData.success(200, "OK", JSON.parseObject(result));
        }
    }
 

實際使用

api.gateway('BIScrapActions', {
  PlantCode: 'P01',
  RptType: 'Scrap'
}).then((resp) => {
  this.data = resp
  this.initCharts()
})
 

這樣就完成了。

POSTMAN 參數自動格式化

  this.params_table = val.split(' ').map((item) => {
    return {
      name: item.split(':')[0],
      value: item.split(':')[1]
    }
  })
},
 

提供介面測試

在介面維護的時候會填寫參數KV,值為測試值,可以在網頁測試介面是否通過。在實際調用中會對參數進行匹配。

最後吐個槽,要不是老是改介面煩死了,估計我也不會這麼想,不得不說程式員得學會偷懶。

這不就把活丟給別人做了嗎,WMS有新的介面了自己去BI後臺維護去,哈哈哈哈哈哈。


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

-Advertisement-
Play Games
更多相關文章
  • 什麼是隱藏類 隱藏類,是一種不能被其他類直接使用的類。引入隱藏類的主要目的是給框架來使用,使得框架可以在運行時生成類,並通過反射間接使用它們。可能有點抽象,不要緊,下麵我們通過一個例子來直觀的認識它! 隱藏類案例 第一步:先創建一個普通的Java類 public class JEP371Hidden ...
  • 下麵介紹的是JUC包下一些線程安全類的一些簡單使用和一些小demo。 Semaphore 信號量,即可以同時使用的線程數,tryrequire就是將信號量減一,release就是信號量+1,當等於0就會阻塞,大於零才會喚醒。 當需要控制線程訪問數量,可以使用信號量來做控制,比較簡單。 下麵是使用信號 ...
  • Spring Ioc源碼分析系列--Ioc容器註冊BeanPostProcessor後置處理器以及事件消息處理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那麼這一篇繼續在refresh()方法里游蕩,相信對Spring熟悉點的朋友,在看完BeanFactoryPost ...
  • 大家好,這篇文章分享了C程式設計(譚浩強)第五版第十章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
  • 高精度 運算:加法、減法、階乘、乘法 翻轉: 這些運算都是從小位開始,所以一般需要翻轉。以字元串儲存:reverse(a.begin(),a,end())。以數組儲存: for (int i1 = lena1 - 1; i1 >= 0; i1--) { a1[lena1-1-i1] = a[i1] ...
  • 大家好,這篇文章分享了C程式設計(譚浩強)第五版第九章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
  • 回溯法(98條消息) (新手向)遞歸與回溯演算法學習(一)——n位逐位整除數_TripleGold.的博客-CSDN博客 演算法思想: (通用的解題法)窮舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現不滿足求解條件時就回退,嘗試其他路徑 回溯法的解題步驟: 針對給定問題確定問題的解空間樹, ...
  • 大家好,這篇文章分享了C程式設計(譚浩強)第五版第八章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...