Введение
Comindware Platform позволяет отправлять HTTP-запросы типов GET, POST, PUT, DELETE с помощью сценариев для взаимодействия с внешними системами.
Здесь представлен пример настройки подключения, пути передачи данных и сценария для отправки HTTP-запросов POST с использованием C#-скриптов и записи данных из ответа сервера в формате JSON в атрибуты шаблона записи.
Настройка для обработки данных в формате XML и простого текста будет аналогичной.
Внимание!
Модели данных классов в C#-скриптах и в пути передачи данных должны совпадать, в противном случае данные не будут сопоставлены и не будут передаваться.
Прикладная задача
Требуется отправить заказ из нескольких позиций и получить статус заказа: Принят или Отклонён.
Рассмотрим настройку отправки запросов на сервер и получение от него ответов.
- Имеются шаблоны записей:
- «Заказы» с атрибутами:
- «Номер заказа» типа «Текст»;
- «Позиции» типа «Запись», ссылается на шаблон «Позиции заказов» и хранит несколько значений;
- «Статус заказа» типа «Текст».
- «Позиции заказов» с атрибутами:
- «Товар» типа «Текст»;
- «Количество» типа «Число».
- Базовый URL для HTTP-запросов:
https://<hostname>/api -
Путь для отправки заказа на проверку статуса:
https://<hostname>/api/place-orderПри настройке приложения подставьте реальный адрес вместо
https://<hostname>/api/place-order -
Сценарий выполняет следующие операции:
- формирует данные для отправки с помощью C#-скрипта;
- отправляет HTTP-запрос на сервер;
- обрабатывает полученный ответ и изменяет статус заказа с помощью C#-скрипта.
-
Запрос содержит данные позиций в формате JSON вида:
{"orderNumber": "string","items": [{"product": "string","quantity": "int"}]} -
В ответ на запрос сервер возвращает JSON-ответ вида:
{"status": "string"}
Настройка подключения
- Откройте раздел «Администрирование» — «Подключения».
-
В меню «Создать» выберите пункт «Подключения REST и OData» — «Отправка HTTP-запросов».

Создание подключения для отправки HTTP-запросов -
Настройте подключение для отправки HTTP-запросов со следующими параметрами:
- URI —
https://<hostname>/api. Символ/в конце URI не требуется. - Формат данных — JSON. Также поддерживаются XML и простой текст, но здесь рассматривается обработка данных в формате JSON.
- URI —
-
Остальные параметры подключения настройте в соответствии с конфигурацией используемого сервера. См. «Отправка HTTP-запросов. Настройка подключения».

Настройка пути передачи данных
- Откройте раздел «Администрирование» — «Пути передачи данных».
-
В меню «Создать» выберите пункт «Подключения REST и OData» — «Отправка HTTP-запросов».

Создание пути передачи данных для отправки HTTP-запросов -
Настройте путь передачи данных для отправки HTTP-запросов на вкладках «Основные свойства», «Атрибуты сообщений», «Интеграция».
Основные свойства
- Подключение — выберите ранее созданное подключение для отправки HTTP-запросов.
- Системное имя — введите системное имя пути передачи данных латинскими буквами.
- Отключить — установите этот флажок, если требуется деактивировать путь передачи данных.
- Описание — введите наглядное описание назначения пути передачи данных.

Атрибуты сообщений
- Тип сообщения — выберите «Отправка HTTP-запросов».
-
Запрос — добавьте следующие атрибуты:
orderNumberтипа «Строка» — номер заказа.itemsтипа «Объект»:- Установите флажок «Массив» — атрибут
itemsбудет содержать массив позиций. - Установите флажок слева от атрибута
itemsи добавьте в него дочерние атрибуты:productтипа «Строка» — название товара.numberтипа «Число» — количество товара.
- Установите флажок «Массив» — атрибут
В эти атрибуты будут передаваться данные позиций для отправки на внешний сервер.
Системные имена этих атрибутов должны совпадать с именами соответствующих полей HTTP-запроса.
-
Ответ — добавьте атрибут
statusтипа «Строка» — этот атрибут будет содержать статус с ответом от сервера. - Ответ с ошибкой — добавьте атрибут
statusтипа «Строка» — этот атрибут будет содержать статус с ошибкой от сервера.

Интеграция
- Метод запроса — выберите POST.
-
Шаблон пути запроса — введите
place-order(фактический путь к HTTP-запросу на сервере), этот суффикс будет добавлен к URI, указанному в свойствах подключения для отправки HTTP-запросов.То есть, при шаблоне пути запроса
place-orderдля URIhttps://<hostname>/apiрезультирующий путь запроса будетhttps://<hostname>/api/place-order. -
Атрибут для сериализации в тело запроса — введите через запятую системные имена атрибутов из таблицы «Запрос» на вкладке «Атрибуты сообщений», в нашем примере:
orderNumber,items.
Настройка интеграции в свойствах пути передачи данных для отправки HTTP-запросов -
Атрибуты для десериализации ответа без ошибки и Атрибуты для десериализации ответа с ошибкой — создайте одну строку в каждой таблице и введите символ
$в столбцы «Путь к атрибуту» и «Выражение на языке запросов». Этот символ обозначает передачу всей структурыJSON.
Настройка атрибутов для десериализации ответа в пути передачи данных для отправки HTTP-запросов
Настройка сценария отправки HTTP-запроса
Логика работы сценария
- В сценарии используются два C#-скрипта и три переменные для подготовки данных и обработки ответа сервера:
Body— переменная для хранения данных сообщения перед отправкой;Success— переменная для хранения успешного ответа от сервера;Error— переменная для хранения ответа с ошибкой от сервера.
- HTTP-запрос отправляется с помощью действия «Отправить сообщение».
- Создайте сценарий, например, выполняющийся по нажатию кнопки.
-
В свойствах действия «Нажатие кнопки» укажите контекстный шаблон, содержащий атрибуты для HTTP-запроса и ответа.

Настройка контекстного шаблона для отправки HTTP-запроса -
После действия «Нажатие кнопки» добавьте действие «Проверить результат скрипта» для подготовки данных HTTP-запроса с помощью C#-скрипта следующим образом:
-
Сообщение об ошибке — введите текст сообщения, которое будет отображено, если скрипт вернёт
false(например, «Не удалось подготовить данные заказа»).Скрипт должен возвращать
true. Если скрипт вернётfalse, сценарий будет остановлен. -
Выражение — задайте C#-скрипт для подготовки данных по следующему образцу:
using System;using System.Collections.Generic;using System.Linq;using Comindware.Data.Entity;using Comindware.TeamNetwork.Api.Data.UserCommands;using Comindware.TeamNetwork.Api.Data;class Script{public static bool Main(Object o){// Получаем ID текущей записи (заказа)var id = o.ToString().Replace("user.", "");// Получаем данные записи:// значения атрибутов «Позиции» и «Номер заказа»var data = Api.TeamNetwork.ObjectService.GetPropertyValues(new []{id}, new []{"Позиции", "НомерЗаказа"});var itemsIdsArray = data[id]["Позиции"] as object[];// Объявляем массив позиций (класс Item)var listItems = new List<Item>();// Получаем данные каждой позицииforeach(var itemId in itemsIdsArray){var itemData = Api.TeamNetwork.ObjectService.GetPropertyValues(new []{itemId.ToString()}, new []{"Товар", "Количество"});// Собираем экземпляр класса Itemvar item = new Item{product = itemData[itemId.ToString()]["Товар"].ToString(), number = Convert.ToInt32(itemData[itemId.ToString()]["Количество"].ToString())};// Собираем массив позиций для отправкиlistItems.Add(item);}// Переменная для отправляемых данныхvar outMessage = new OutgoingRootMessage{name = data[id]["НомерЗаказа"].ToString(), items = listItems};// Проставляем в локальную переменную значение для последующей отправки// OutgoingRootMessage – класс сообщения (структура данных)// Имя RawBody – состоит из двух частей://1. Raw – системная часть//2. Body – имя переменной с сообщением, заданной в действии «Отправить сообщение»Api.Base.LocalVariablesService.Set<OutgoingRootMessage>("RawBody", outMessage);return true;}}public class OutgoingRootMessage{public string name {get; set;}public List<Item> items {get; set;}}public class Item{public string product {get; set;}public int number {get; set;}} -
-
Добавьте и настройте действие «Отправить сообщение»:
- Подключение — выберите подключение для отправки HTTP-запросов.
- Путь передачи данных — выберите ранее настроенный путь для передачи данных HTTP-запроса.
- Переменная с сообщением — введите системное имя переменной, в которую предшествующее действие «Проверить результат скрипта» помещает данные запроса (в нашем примере
Body, без префиксаRaw). - Переменная для успешного ответа — введите системное имя переменной, в которую будет помещён ответ сервера на HTTP-запрос (например,
Success). -
Переменная для ответа с ошибкой — введите системное имя переменной, в которую будет помещён ответ сервера в случае ошибки (например,
Error).
Настройка действия сценария для отправки HTTP-запроса
-
Добавьте и настройте второе действие «Проверить результат скрипта» для проверки ответа после отправки.
Это действие использует C#-скрипт для проверки и обработки ответа от сервера. Если скрипт вернёт
false, сценарий будет остановлен.- Сообщение об ошибке — введите текст сообщения, которое будет отображено, если скрипт вернёт
false(например,"ошибка"). - Выражение — задайте C#-скрипт для проверки ответа.
Образец скрипта для проверки ответа:
using System;using System.Collections.Generic;using System.Linq;using Comindware.Data.Entity;using Comindware.TeamNetwork.Api.Data.UserCommands;using Comindware.TeamNetwork.Api.Data;class Script{public static bool Main(Object o){// Получаем ID текущей записиvar id = o.ToString().Replace("user.", "");// Получаем значения из успешного ответа.// Имя RawSuccess состоит из двух частей:// 1. Raw – неизменный системный префикс// 2. Success – имя переменной для успешного ответа, заданной в действии «Отправить сообщение»var inputSuccess = Api.Base.LocalVariablesService.Get<IncomingRootMessage>("RawSuccess");// Получаем значение из ответа с ошибкой.// Имя RawError состоит из двух частей:// 1. Raw – неизменный системный префикс// 2. Error – имя переменной для ответа с ошибкой, заданной в действии «Отправить сообщение»var inputError = Api.Base.LocalVariablesService.Get<IncomingRootMessage>("RawError");// Помещает полученный статус в атрибут «Статус заказа»// СтатусЗаказа — системное имя атрибутаif(inputSuccess != null){Api.TeamNetwork.ObjectService.EditWithAlias(id, new Dictionary<string,object>{{"СтатусЗаказа",inputSuccess.status}});}else if(inputError != null){Api.TeamNetwork.ObjectService.EditWithAlias(id, new Dictionary<string,object>{{"СтатусЗаказа",inputError.status}});}else{Api.TeamNetwork.ObjectService.EditWithAlias(id, new Dictionary<string,object>{{"СтатусЗаказа","Произошла ошибка"}});}return true;}}public class IncomingRootMessage{public string status {get; set;}} - Сообщение об ошибке — введите текст сообщения, которое будет отображено, если скрипт вернёт
-
Результирующий сценарий должен выглядеть, как показано на следующей иллюстрации.

Сценарий для отправки HTTP-запроса с использованием C#-скриптов -
Проверьте работу приложения: сценарий должен отправлять HTTP-запрос с позициями заказа и получать статус заказа от внешнего сервера.