logo

Интеграция с веб-сервисом через форму портлета

  1. Добавим в модуль интеграции активити получения курсов валют к рублю по аналогии с тем, как это сделали в разделе выше.

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. Опубликуем форму и вынесем портлет на страницу. Нажмём кнопку Обновить.