Вызвать пользовательский веб-сервис из front-end части

Средний
PDF

Пример. На страницу добавления нового контакта добавить кнопку, по клику на которую будет вызываться пользовательский веб-сервис. В информационном окне страницы отобразить результат, возвращаемый методом веб-сервиса.

1. Создать пользовательский веб-сервис 

В примере используется пользовательский веб-сервис UsrCustomConfigurationService, разработка которого описана в статье Разработать пользовательский веб-сервис с аутентификацией на основе cookies.

В веб-сервисе UsrCustomConfigurationService измените параметр Method атрибута WebInvoke на POST.

Исходный код пользовательского веб-сервиса, используемого в примере, представлен ниже.

UsrCustomConfigurationService
namespace Terrasoft.Configuration.UsrCustomConfigurationServiceNamespace
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Core.Entities; 

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrCustomConfigurationService: BaseService
    {
        
        /* Метод, возвращающий идентификатор контакта по имени контакта. */
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string GetContactIdByName(string Name) {
            /* Результат по умолчанию. */
            var result = "";
            /* Экземпляр EntitySchemaQuery, обращающийся в таблицу Contact базы данных. */
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
            /* Добавление колонок в запрос. */
            var colId = esq.AddColumn("Id");
            var colName = esq.AddColumn("Name");
            /* Фильтрация данных запроса. */
            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", Name);
            esq.Filters.Add(esqFilter);
            /* Получение результата запроса. */
            var entities = esq.GetEntityCollection(UserConnection);
            /* Если данные получены. */
            if (entities.Count > 0)
            {
                /* Возвратить значение колонки "Id" первой записи результата запроса. */
                result = entities[0].GetColumnValue(colId.Name).ToString();
                /* Также можно использовать такой вариант:
                result = entities[0].GetTypedColumnValue<string>(colId.Name); */
            }
            /* Возвратить результат. */
            return result;
        }
    }
}

2. Создать замещающую страницу записи контакта 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. В свойстве Родительский объект (Parent object) выберите схему модели представления Схема отображения карточки контакта (Display schema — Contact card) пакета ContactPageV2, которую необходимо заместить. После подтверждения выбранного родительского объекта остальные свойства будут заполнены автоматически.

  4. В объявлении модуля страницы записи в качестве зависимости подключите модуль ServiceHelper. Зависимости модуля описаны в статье Функция define().

3. Добавить кнопку на страницу записи контакта 

  1. В блоке Локализуемые строки (Localizable strings) панели свойств нажмите кнопку и заполните свойства локализуемой строки:

    • Код (Code) — "GetServiceInfoButtonCaption".
    • Значение (Value) — "Вызвать сервис" ("Call service").
  2. Добавьте обработчик кнопки.

    Для вызова веб-сервиса воспользуйтесь методом callService() модуля ServiceHelper. Параметры функции callService(), которые необходимо передать:

    • UsrCustomConfigurationService — имя класса пользовательского веб-сервиса.
    • GetContactIdByName — имя вызываемого метода пользовательского веб-сервиса.
    • Функцию обратного вызова, в которой выполните обработку результатов сервиса.
    • serviceData — объект с проинициализированными входящими параметрами для метода пользовательского веб-сервиса.
    • Контекст выполнения.

    Исходный код схемы замещающей модели представления ContactPageV2 представлен ниже.

    ContactPageV2
    define("ContactPageV2", ["ServiceHelper"],
    function(ServiceHelper) {
        return {
            /* Название схемы объекта страницы записи. */
            entitySchemaName: "Contact",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            /* Методы модели представления страницы записи. */
            methods: {
                /* Проверяет, заполнено ли поле [ФИО] страницы. */
                isContactNameSet: function() {
                    return this.get("Name") ? true : false;
                },
                /* Метод-обработчик нажатия кнопки. */
                onGetServiceInfoClick: function() {
                    var name = this.get("Name");
                    /* Объект, инициализирующий входящие параметры для метода сервиса. */
                    var serviceData = { 
                        /* Название свойства совпадает с именем входящего параметра метода сервиса. */
                        Name: name
                    };
                    /*/ Вызов веб-сервиса и обработка результатов. */
                    ServiceHelper.callService("UsrCustomConfigurationService", "GetContactIdByName",
                        function(response) {
                            var result = response.GetContactIdByNameResult;
                            this.showInformationDialog(result);
                        }, serviceData, this);
                }
            },
            diff: /**SCHEMA_DIFF*/[
                /* Метаданные для добавления на страницу пользовательской кнопки. */
                {
                    /* Выполняется операция добавления элемента на страницу. */
                    "operation": "insert",
                    /* Имя родительского элемента управления, в который добавляется кнопка. */
                    "parentName": "LeftContainer",
                    /* Кнопка добавляется в коллекцию элементов управления родительского элемента, мета-имя которого указано в parentName. */
                    "propertyName": "items",
                    /* Имя добавляемой кнопки. */
                    "name": "GetServiceInfoButton", 
                    /* Дополнительные свойства поля. */
                    "values": {
                        /* Тип добавляемого элемента - кнопка. */
                        itemType: Terrasoft.ViewItemType.BUTTON,
                        /* Привязка заголовка кнопки к локализуемой строке схемы. */
                        caption: {bindTo: "Resources.Strings.GetServiceInfoButtonCaption"},
                        /* Привязка метода-обработчика нажатия кнопки. */
                        click: {bindTo: "onGetServiceInfoClick"},
                        /* Привязка свойства доступности кнопки. */
                        enabled: {bindTo: "isContactNameSet"},
                        /* Настройка расположения поля. */
                        "layout": {"column": 1, "row": 6, "colSpan": 2, "rowSpan": 1}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });
    
  3. На панели инструментов дизайнера нажмите Сохранить (Save).

Результат выполнения примера 

В результате выполнения примера после обновления страницы приложения на странице контакта появится кнопка Вызвать сервис (Call service). При нажатии на эту кнопку вызывается метод GetContactIdByName пользовательского веб-сервиса UsrCustomConfigurationService, который возвращает значение идентификатора текущего контакта.