Pull to refresh

Создание простого веб-сервиса на платформе SMC

Доброго времени суток.

Продолжаю серию статей про использование платформы 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" ;
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.