介面轉發調用 問題描述 在開發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(