Доброго времени суток.
Продолжаю серию статей про использование платформы SMC. Здесь покажу, как создать простой веб сервис, возвращающий текущую дату и время.
Все действия будем производить в графическом конструкторе (для ценителей кода тоже самое можно написать с использованием языка SMCL., в конце выложил код).
Запустите систему SMC (скачать можно с сайта).
Важная особенность данного примера - сервис будет плагином (дочерним приложением) для приложения веб сервера (Active Web Server). Нужно установить (если не установлено) приложение веб сервера, для этого перейдите на вторую вкладку - Приложения (расширенное) и нажмите кнопку - Установить из репозитория. В открывшемся окне слева выделите Active Web Server и нажмите кнопку - Установить. в процессе установки появится запрос на установку дополнительного модуля HttpServer - соглашайтесь. Теперь в списке приложений появилось приложение веб сервера.
Теперь займемся созданием самого веб-сервиса. Его алгоритм следующий:
Получение текущего времени.
Создание объекта, содержащего 2 поля: name=getDate, value=время.
Конвертирование объекта в json строку.
Создание ответа сервиса, содержащего код 200 и строку json.

Приступим. Перейдите на вкладку Конструктор, слева раскройте каталог Active Web Server и выделите pages. эта папка по умолчанию пуста и предназначена для всех веб приложений. теперь, сверху, на панели инструментов нажмите кнопку Создать каталог - введите getDate. выделите появившийся каталог. На панели инструментов, с помощью кнопки Создать конфигурацию, поочередно создайте 5 конфигураций модулей: PrintDate - имя date, PrintValue - resultObject, ValueTypeConvertor - toJson, PrintValue - result, OrderExecutor - executor.
Далее настройте каждую конфигурацию и связи между ними. Для этого посмотрите видео:
Для запуска сервиса на первой вкладке (Приложения) щелкните на значке приложения Active Web Server. Теперь можно проверять, ссылка: https://localhost:8080/getData
Как видно создавать веб-сервисы весьма просто (даже проще чем написать об этом :)).
В качестве дальнейших шагов, можно установить другие веб приложения (плагины), чтобы посмотреть как они сделаны. Например, есть полноценный веб сайт - форум.
ПС: обратите внимание на динамичность в видео примере - редактируется уже запущенный сервис, при этом скорость работы не снижается (модули в примере написаны на Java). так же показано, как просматривать данные, генерируемый модулями, что очень ценно например при поисках ошибок а так же логировании.
пс2: код на языке SMCL:
create container name="getDate" parent="Active Web Server.pages::" enable=true;
use container getDate;
create cfg moduleDefinition="PrintDate" name="date" description="" dataSavePeriod=0 bufferSize=1 generateSystemData=false enable=true ;
update setting path="date.format" value="HH:mm:ss dd MMM yyyy" ;
create executionContext cfg="date" name="default" executionContexts={} managedConfigurations={} maxWorkInterval=-1 triggerType="ON_DEMAND" systemTriggerInterval=1 enable=true ;
create cfg moduleDefinition="PrintValue" name="resultObject" description="" dataSavePeriod=0 bufferSize=1 generateSystemData=false enable=true ;
update setting path="resultObject.type" value="AUTO" ;
update setting path="resultObject.appendType" value="PLACEHOLDER" ;
update setting path="resultObject.value" value="2::name::getDate::value::{0}" ;
update setting path="resultObject.splitterValues" value="::" ;
create executionContext cfg="resultObject" name="default" executionContexts={} managedConfigurations={} maxWorkInterval=-1 triggerType="ON_DEMAND" systemTriggerInterval=1 enable=true ;
create contextSource executionContext="resultObject.default" type="EXECUTION_CONTEXT" getType="NEW" countLast=1 valueType="INTEGER" value=Active Web Server.pages.getDate::date.default ;
create cfg moduleDefinition="ValueTypeConverter" name="toJson" description="" dataSavePeriod=0 bufferSize=1 generateSystemData=false enable=true ;
update setting path="toJson.type" value="8" ;
update setting path="toJson.charsetName" value="UTF-8" ;
update setting path="toJson.param" value=" " ;
create executionContext cfg="toJson" name="default" executionContexts={} managedConfigurations={} maxWorkInterval=-1 triggerType="ON_DEMAND" systemTriggerInterval=1 enable=true ;
create contextSource executionContext="toJson.default" type="EXECUTION_CONTEXT" getType="NEW" countLast=1 valueType="INTEGER" value=Active Web Server.pages.getDate::resultObject.default ;
create cfg moduleDefinition="PrintValue" name="result" description="" dataSavePeriod=0 bufferSize=1 generateSystemData=false enable=true ;
update setting path="result.type" value="AUTO" ;
update setting path="result.appendType" value="FIRST" ;
update setting path="result.value" value="200::Content-Type: application/json\; charset=utf-8" ;
update setting path="result.splitterValues" value="::" ;
create executionContext cfg="result" name="default" executionContexts={} managedConfigurations={} maxWorkInterval=-1 triggerType="ON_DEMAND" systemTriggerInterval=1 enable=true ;
create contextSource executionContext="result.default" type="EXECUTION_CONTEXT" getType="NEW" countLast=1 valueType="INTEGER" value=Active Web Server.pages.getDate::toJson.default ;
create cfg moduleDefinition="OrderingExecutor" name="executor" description="" dataSavePeriod=0 bufferSize=1 generateSystemData=false enable=true ;
update setting path="executor.executionType" value="now" ;
update setting path="executor.type" value="execute" ;
update setting path="executor.isNeedReturnDataFromLast" value="true" ;
update setting path="executor.breakWhenError" value="false" ;
update setting path="executor.breakWhenNoDataFromPrev" value="false" ;
create executionContext cfg="executor" name="default" executionContexts={Active Web Server.pages.getDate::date.default,Active Web Server.pages.getDate::resultObject.default,Active Web Server.pages.getDate::toJson.default,Active Web Server.pages.getDate::result.default} managedConfigurations={} maxWorkInterval=-1 triggerType="ON_DEMAND" systemTriggerInterval=1 enable=true ;
create contextSource executionContext="executor.default" type="CALLER" getType="NEW" countLast=1 valueType="INTEGER" ;