如何在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链接)的主要内容,如果未能解决你的问题,请参考以下文章