Как правильно обрабатывать развертывание некоторых API-интерфейсов WEST ESB REST в двух разных средах? (содержит на данный момент жестко закодированную ссылку HATEOAS) - PullRequest
0 голосов
/ 05 июля 2018

Я не настолько в WSO2 ESB , и у меня есть следующая ситуация, с которой нужно разобраться. Я пытаюсь объяснить это в деталях.

У меня есть ESB проект, содержащий некоторые REST API . Эти REST API реализуют концепцию HATEOAS . На практике я просто добавляю ссылку на возвращенные ресурсы. Я делаю это с помощью посредника сценариев, который манипулировал 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";

Я не знаю, является ли это более аккуратным решением, но оно работает нормально, и в настоящее время я не могу его извинить.

Проблема в том, что я жестко кодирую URL-адрес href в предыдущем JavaScript, который манипулирует моим JSON.

Теперь у меня есть 2 среды: одна для DEV и другая для PROD. И у меня много API. Я знаю, что могу просто выполнить поиск и замену строк (я ищу URL-адрес XXX.YYY.ZZZ.KKK , заменяя его URL-адресом PROD перед развертыванием в PROD).

Но я думаю, что это абсолютно грязное и ужасное решение.

Итак: что может быть более аккуратным решением?

Моя идея:

  • Я создаю новую последовательность, которая содержит свойство current_env , в котором я задаю URL-адрес среды.

  • Я включаю эту последовательность в начале каждого ESB файла, содержащего определение моего API.

  • Я извлекаю значение этого свойства в свой посредник script и использую его для создания ссылки HATEOAS .

Может быть, это довольно приличное решение? Или существует какой-то лучший способ сделать это? (может быть, значение, подобное этому, может храниться в другом месте, отличном от последовательности? Я действительно не знаю)

1 Ответ

0 голосов
/ 05 июля 2018

Упоминание URL-адресов в посреднике сценариев или в коде является плохой практикой. Вместо того, чтобы следовать этому подходу, можно добавить URL-адрес в локальные записи, извлечь значение в последовательности и затем добавить в посредник сценариев, поэтому в этом случае всякий раз, когда Развернут файл CAR с общим кодом, и все динамические артефакты могут быть упомянуты в локальных файлах.

...