如何在2个不同的环境中正确处理某些WSO2 ESB REST API的部署? (目前包含硬编码的HATEOAS链接)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在2个不同的环境中正确处理某些WSO2 ESB REST API的部署? (目前包含硬编码的HATEOAS链接)相关的知识,希望对你有一定的参考价值。

我不是很喜欢WSO2 ESB,我有以下情况需要处理。我试着详细解释一下。

我有一个包含一些REST API的ESB项目。这些REST API实现了HATEOAS概念。在实践中,我只是添加链接到返回的resoruces。我正在使用脚本调解器来操作它,然后在返回之前操纵JESON,在我的API中我有这样的事情:

<script language="js">
<![CDATA[
    var log = mc.getServiceLog();
    function checkForNull(value) {
        if (value instanceof Object && "@nil" in value) {
            return null;
        }

        return value;
    }

    log.info("----------- COMMODITY DETAILS JS SCRIPT START --------------------");
    // Strange workaround for getting JSON Payload. getPayloadJSON returned null. 
    var pl_string = mc.getProperty("JSONPayload"); 
    var payload = JSON.parse(pl_string);
    log.info("PAYLOAD STRING: " + pl_string);

    // Create new response:          
    var response = payload.Commodity.Commodity;
    log.info("RESPONSE: " + JSON.stringify(response));

    // Convert array of markets into required HATEOS format
    var markets = new Array();

    // Convert array of markets into required HATEOS format:
    for (i = 0; i < response.markets.el.length; ++i) {
        log.info("MARKET " + i);
        var el = response.markets.el[i];

        var newEl = new Object();

        newEl.market_id = el.market_id;
        newEl.market_name = el.market_name;

        // Convert null values:
        newEl.region = checkForNull(el.region);
        newEl.province = checkForNull(el.province);
        newEl.city = checkForNull(el.city);
        newEl.district = checkForNull(el.district);
        newEl.town = checkForNull(el.town);
        newEl.village = checkForNull(el.village);


        newEl.rel = "market_details";
        newEl.href = "http://XXX.YYY.ZZZ.KKK:8280/market_details/" + el.market_id;
        newEl.type = "GET";

        markets.push(newEl);
    }

    response.markets = markets;

    log.info("RESPONSE AFTER checkForNull(): " + JSON.stringify(response));

    // Put payload back:
    mc.setPayloadJSON(response);
    log.info("----------- COMMODITY DETAILS JS SCRIPT END --------------------");
]]>
</script>

正如您在此脚本调解器中看到的,我正在添加HATEOAS链接:

    newEl.rel = "market_details";
    newEl.href = "http://XXX.YYY.ZZZ.KKK:8280/market_details/" + el.market_id;
    newEl.type = "GET";

我不知道它是否是更整洁的解决方案,但它工作正常,此刻我无法挑战它。

问题是我将href URL硬编码到以前操纵我的JSON的javascript中。

现在我有2个环境:一个用于DEV,另一个用于PROD。我有很多API。我知道我可以简单地进行字符串搜索和替换(我在PROD中部署之前搜索XXX.YYY.ZZZ.KKK DEV URL替换为PROD URL)。

但我认为这是一个绝对肮脏和可怕的解决方案。

那么:什么可以是更整洁的解决方案?

我的想法是:

  • 我创建了一个包含current_env属性的新序列,在该属性中我设置了环境的URL。
  • 我将此序列包含在包含API定义的每个ESB文件的开头。
  • 我将此属性的值检索到我的脚本调解器中,并使用它来生成我的HATEOAS链接。

这可能是一个非常好的解决方案吗?还是存在一些更好的方法呢? (也许像这样的值可以存储在与序列不同的其他地方?我真的不知道)

答案

在脚本中介或代码中提及URL是一种不好的做法,而不是遵循这种方法,您可以在本地条目中添加URL,获取序列中的值,然后附加到脚本中介,因此在这种情况下,只要CAR文件是已部署的将具有通用代码,并且可以在本地提供所有动态工件。

以上是关于如何在2个不同的环境中正确处理某些WSO2 ESB REST API的部署? (目前包含硬编码的HATEOAS链接)的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse JEE Mars 2 配置 WSO2 ESB 5.0.0 环境

在 wso2esb 中使用 JMS 时如何解决这些错误

WSO2 ESB 5.0.0 配置 MySQL 数据源

如何在 WSO2 ESB 中访问注册表

WSO2 ESB 5.0.0 配置 MySQL 数据源

如何从 wso2 ESB 中的另一个服务调用服务(或一个服务的参数)