Получить URL-адрес из узла HTTP-запроса

Мой msgflow выглядит так:

MQinput -> Вычислительный узел -> HTTP-запрос

У меня override.properties для DEV установлено значение:

MsgflowName#HTTP Request.URLSpecifier = https://myDevUrl.com/id

и еще 2 файла override.properties для TEST и PROD:

MsgflowName#HTTP Request.URLSpecifier = https://myTestUrl.com/id

и

MsgflowName#HTTP Request.URLSpecifier = https://myProdUrl.com/id

но я хочу передавать URL-адреса динамически, например https://myDevUrl.com/id/123, где 123 это id, который я получаю в запросе.

Я знаю, что могу использовать:

SET OutputLocalEnvironment.Destination.HTTP.RequestURL = https://myUrl.com/id/123

но для этой команды я не знаю, предназначен ли этот URL-адрес для DEV, TEST или PROD.

Я могу решить эту проблему, вставив URL-адрес DEV / TEST / PROD в DB, ​​но я ищу более простой способ.

Итак, мой вопрос:

У меня есть способ получить URL-адрес из узла HTTP-запроса (который установлен в override.properties)

Что-то типа:

SET URL = OutputLocalEnvironment.Destination.HTTP.RequestURL;  -- was not worked 

или

есть ли другой обходной путь?


person Pivoman    schedule 25.01.2019    source источник


Ответы (2)


Просмотр свойств которые доступны из ESQL, придется искать обходной путь.

Определите User- Определенное свойство (UDP) в следующих переопределениях:

MsgflowName#TheURL = https://myDevUrl.com/id

Доступ к UDP вот так:

CREATE COMPUTE MODULE YourModule
  DECLARE TheURL EXTERNAL CHARACTER '';

  CREATE FUNCTION Main() RETURNS BOOLEAN
  BEGIN
    DECLARE idFromRequest CHARACTER ...;
    DECLARE url CHARACTER TheURL || '/' || idFromRequest;
    SET OutputLocalEnvironment.Destination.HTTP.RequestURL = url;
    ...
person Daniel Steinmann    schedule 25.01.2019
comment
Похоже, лучшее решение для меня, я им воспользуюсь. Спасибо :) - person Pivoman; 28.01.2019
comment
Кстати. остерегайтесь определяемых пользователем атрибутов, которым должно быть присвоено начальное значение в операторе DECLARE или значение при ошибке времени развертывания после развертывания. Таким образом, определение URL-адреса должно быть не менее DECLARE TheURL EXTERNAL CHARACTER ''; во время отладки. - person Pivoman; 29.01.2019
comment
@Pivoman, хорошо, спасибо за отзыв, я обновил свой ответ. - person Daniel Steinmann; 29.01.2019

Это вариант ответа @Daniel Steinmann. Вам необходимо решить, насколько надежны и согласованы ваше соглашение об именах брокера и соглашения об именовании URL целевой системы, и можно ли к ним подойти алгоритмически.

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

CREATE COMPUTE MODULE ComputeNode
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
    DECLARE UrlPattern CHAR 'https://target-XX/resource/';
    IF CONTAINS(BrokerName, 'DEV') THEN
        SET UrlPattern = REPLACE(UrlPattern, 'XX', 'dev');
    ELSEIF CONTAINS(BrokerName, 'TST') THEN
        SET UrlPattern = REPLACE(UrlPattern, 'XX', 'test');
    ELSEIF CONTAINS(BrokerName, 'PRD') THEN
        SET UrlPattern = REPLACE(UrlPattern, 'XX', '');
    END IF;

    SET OutputLocalEnvironment.Destination.HTTP.RequestURL =
        UrlPattern || InputRoot.JSON.Data.Aggregate.PrimaryKeyField;
    ....

Я хотел бы отметить, что большинство сайтов, над которыми я работал, будут иметь базу данных конфигурации, и если у вас ее нет, вполне вероятно, что вы будете иметь ее в не столь отдаленном будущем. С момента создания узлов Callable Flow я начал использовать их, чтобы иметь один Callable Flow, который обрабатывает загрузку данных конфигурации.

Удачи с вашим решением.

person TJA    schedule 28.01.2019
comment
Жесткое кодирование возможно и для этого сценария, но я лучше воспользуюсь решением Daniels. Мы используем запрос к базе данных для URL-адресов только для одного приложения, но я не хочу создавать новую таблицу, и мне не очень нравится зависимость от базы данных. В любом случае спасибо за хороший совет. - person Pivoman; 28.01.2019