• Gateway接口转发维护


    接口转发调用

    问题描述

    在开发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后台维护去,哈哈哈哈哈哈。

  • 相关阅读:
    jdbc详解(三)
    超文本传输协议-HTTP/1.1
    前人栽树,后人擦屁股
    JAVA 读取计算机中相关信息
    POJ 1836-Alignment(DP/LIS变形)
    【Android】自己定义控件实现可滑动的开关(switch)
    加深理解UIView,UIResponder,UIController
    Fuel4d 2.3 公布
    Android中使用IntentService运行后台任务
    POJ2762 Going from u to v or from v to u? 强连通+缩点
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/16284723.html
Copyright © 2020-2023  润新知