Интеграция с веб-сервисом через форму портлета
- Добавим в модуль интеграции активити получения курсов валют к рублю по аналогии с тем, как это сделали в разделе выше.
2. В активити создадим свойства USD, EUR типа Дробное число. При необходимости можно добавить свойства с другими курсами валют. На вкладке Дополнительные укажем точность — 4 знака после запятой.
3. Добавим также свойство URL запроса типа Строка. Заполним его значением по умолчанию — адресом Rest веб-сервиса, возвращающего курс валют к рублю, как показано на рисунке ниже.
4. В активити Получение курсов к рублю вернёмся на вкладку Общие и добавим сценарий.
Пример кода сценария активити модуля интеграции:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.IntegrationModules.Activity;
using EleWise.ELMA.IntegrationModules.Models;
using Newtonsoft.Json;
namespace EleWise.ELMA.IntegrationModules.Activity.Scripts
{
/// <summary>
/// Модуль сценариев объекта "Получение курсов к рублю"
/// </summary>
partial class rates_RUBScripts
{
/// <summary>
/// GetAll
/// </summary>
/// <param name="integrationModule">Экземпляр модуля интеграции</param>
/// <param name="activity">Экземпляр активити</param>
/// <param name="authenticationObject">Объект аутентификации</param>
public virtual void GetAll(EleWise.ELMA.IntegrationModules.IGetExchangeRate integrationModule, EleWise.ELMA.IntegrationModules.Activity.Iger_Activity activity, object authenticationObject)
{
var httpClient = new HttpClient();
var response = httpClient.Get(activity.RequestURL);
var result = string.Empty;
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
var deserializedResult = JsonConvert.DeserializeObject<Response>(result);
activity.USD = deserializedResult.Valute.USD.Value;
activity.EUR = deserializedResult.Valute.EUR.Value;
}
private class Rate
{
public double Value { get; set; }
}
private class RatesResponse
{
public Rate USD { get; set; }
public Rate EUR { get; set; }
}
private class Response
{
public RatesResponse Valute { get; set; }
}
}
}
5. Сохраним активити и опубликуем модуль интеграции.
6. В разделе Интерфейсы создадим портлет Курсы валют, на форму которого после нажатия кнопки выведутся значения курсов валют.
7. В контекст портлета добавим свойства USD и EUR типа Дробное число. На вкладке Дополнительно каждого из свойств установим флажок Только для веб-части и укажем точность 4 знака после запятой.
8. Вынесем эти свойства на форму портлета со значением Только для чтения. Добавим кнопку Обновить.
9. Перейдём в раздел Интерфейсы и добавим структуру обмена данными Курсы валют.
10. В эту структуру обмена данными добавим свойства USD и EUR типа Дробное число для передачи курса. Опубликуем структуру обмена данными.
11. Вернёмся в портлет. Добавим в контекст портлета свойство Получить курсы валют к рублю типа Действие, с помощью которого вызовем серверный код интеграции и передадим значение на клиентскую часть.
12. Перейдём в сценарии. В сценариях На клиенте напишем следующий код, вызывающий серверное действие:
Пространства имен
using System.Threading.Tasks;
public async Task GetRatesClientAsync()
{
var rates = await Context.GetRates();
Context.USD = rates.USD;
Context.EUR = rates.EUR;
}
13. Найдём уникальные идентификаторы модулей интеграции: экземпляра модуля интеграции и типа модуля интеграции. Для этого в системе перейдём в Администрирование — Система — Фильтрация объектов. В качестве объекта для фильтрации выберем Модуль интеграции. В таблице с результатами поиска скопируем значение свойства Уникальный идентификатор нужного нам модуля.
14. Перейдём в Администрирование — Интеграции — Настройки интеграций и откроем Получение курса валют. В адресной строке браузера скопируем уникальный идентификатор после uid=.
Для удобства эти уникальные идентификаторы можно записать в контекстные переменные портлета.
15. Вернёмся в дизайнер и на вкладке портлета На сервере реализуем метод действия GetExchangeRates:
Пространства имен
using System;
using System.Linq;
using EleWise.ELMA.DataClasses;
using EleWise.ELMA.Services;
using EleWise.ELMA.IntegrationModules.Services;
using EleWise.ELMA.Model.Metadata;
using EleWise.ELMA.IntegrationModules.Metadata;
using EleWise.ELMA.IntegrationModules.Activity;
public EleWise.ELMA.DataClasses.Currencies GetExchangeRates()
{
var service = Locator.GetServiceNotNull<IIntegrationModuleScriptingService>();
var integrationModuleInstance = service.CreateInstanceParameters(new Guid("D7673878-79A9-4BAE-A80D-ED3CB529E13F"), new Guid("C65E6F7D-F8CF-4B74-8B17-8E4898873231"));
var instanceMetadata = MetadataLoader.LoadMetadata(integrationModuleInstance.GetType()) as IntegrationModuleMetadata;
var activity = service.CreateActivityParameters(instanceMetadata.IntegrationModuleActivity.First(), new Guid("C65E6F7D-F8CF-4B74-8B17-8E4898873231")) as Irates_RUB;
var metadata = MetadataLoader.LoadMetadata(activity.GetType()) as IntegrationModuleActivityMetadata;
var result = service.ExecuteScript(integrationModuleInstance, activity, metadata.OnEnterScript, null, false);
return new Currencies()
{
USD = activity.USD,
EUR = activity.EUR
};
}
16. Перейдём на форму портлета и добавим в сценарий, который выполняется при нажатии на кнопку, клиентский метод GetRatesClientAsync.
17. Опубликуем форму и вынесем портлет на страницу. Нажмём кнопку Обновить.