接口转发调用
问题描述
在开发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\"))